Return 来自 char[256] 属性访问器的 char[256]
Return char[256] from an accessor of a char[256] attribute
class A{
char info[256];
public:
char* getInfo();
A(char i[256]);
//A.cpp
#include "A.h"
char * A::getInfo(){
return(&info[256]);
}
A::A(char i[256]){
info[256]=i[256];
}
我正在为存取器苦苦挣扎。当我尝试使用 getInfo() 时,我得到一个 char*,因此有了
char test[256] = "test";
FractionException d(test);
for (int i = 0; i < 256; i++) {
cout << d.getInfo()[i] ;
}
我明白了
╠╠╠╠╠╠╠╠test
我想我做事的方式不对,但我想不通..
顺便说一下,VScode 也警告我
info[256]=i[256]
告诉我可能写入了 257 个八位字节 (C6386),但我不明白...
你能帮帮我吗?谢谢!
这个构造函数的声明
A(char i[256]);
意义不大,因为编译器会像
一样调整参数声明
A(char *i);
考虑到这段代码
char test[256] = "test";
FractionException d(test);
for (int i = 0; i < 256; i++) {
cout << d.getInfo()[i] ;
}
您似乎希望构造函数接受字符串。如果是这样,那么它应该声明为
A( const char * );
并且可以这样定义
#include <cstring>
//...
A::A( const char *i ){
strncpy( info, i, sizeof( info ) );
info[sizeof( info ) - 1] = '[=14=]';
}
成员函数getInfo
应该return数组而不是不存在元素的地址info[256]
char * A::getInfo(){
return info;
}
这个方法也应该被重载
const char * getInfo() const;
这个循环
for (int i = 0; i < 256; i++) {
cout << d.getInfo()[i] ;
}
应替换此语句
std::cout << d.getInfo();
问题是,您的构造函数没有正确初始化 info
数组的内容,并且您的访问器 return 使用了一个错误的指针。
在构造函数中,info[256]=i[256]
并没有按照您的想法去做。您正在尝试将 i
的第 257 个元素复制到 info
的第 257 个元素,这是未定义的行为,因为两个数组都没有 257 个元素。这就是编译器警告您的原因。
试试这个:
A::A(char i[256]){
for(int x = 0; x < 256; ++x){
info[x] = i[x];
}
}
或者:
#include <algorithm>
A::A(char i[256]){
std::copy_n(i, 256, info);
}
至于访问器,它是 return 指向不存在的第 257 个元素的指针。您需要 return 指向第一个元素的指针:
char * A::getInfo(){
return(&info[0]);
}
或者简单地说:
char * A::getInfo(){
return info;
}
class A{
char info[256];
public:
char* getInfo();
A(char i[256]);
//A.cpp
#include "A.h"
char * A::getInfo(){
return(&info[256]);
}
A::A(char i[256]){
info[256]=i[256];
}
我正在为存取器苦苦挣扎。当我尝试使用 getInfo() 时,我得到一个 char*,因此有了
char test[256] = "test";
FractionException d(test);
for (int i = 0; i < 256; i++) {
cout << d.getInfo()[i] ;
}
我明白了
╠╠╠╠╠╠╠╠test
我想我做事的方式不对,但我想不通..
顺便说一下,VScode 也警告我
info[256]=i[256]
告诉我可能写入了 257 个八位字节 (C6386),但我不明白...
你能帮帮我吗?谢谢!
这个构造函数的声明
A(char i[256]);
意义不大,因为编译器会像
一样调整参数声明A(char *i);
考虑到这段代码
char test[256] = "test";
FractionException d(test);
for (int i = 0; i < 256; i++) {
cout << d.getInfo()[i] ;
}
您似乎希望构造函数接受字符串。如果是这样,那么它应该声明为
A( const char * );
并且可以这样定义
#include <cstring>
//...
A::A( const char *i ){
strncpy( info, i, sizeof( info ) );
info[sizeof( info ) - 1] = '[=14=]';
}
成员函数getInfo
应该return数组而不是不存在元素的地址info[256]
char * A::getInfo(){
return info;
}
这个方法也应该被重载
const char * getInfo() const;
这个循环
for (int i = 0; i < 256; i++) {
cout << d.getInfo()[i] ;
}
应替换此语句
std::cout << d.getInfo();
问题是,您的构造函数没有正确初始化 info
数组的内容,并且您的访问器 return 使用了一个错误的指针。
在构造函数中,info[256]=i[256]
并没有按照您的想法去做。您正在尝试将 i
的第 257 个元素复制到 info
的第 257 个元素,这是未定义的行为,因为两个数组都没有 257 个元素。这就是编译器警告您的原因。
试试这个:
A::A(char i[256]){
for(int x = 0; x < 256; ++x){
info[x] = i[x];
}
}
或者:
#include <algorithm>
A::A(char i[256]){
std::copy_n(i, 256, info);
}
至于访问器,它是 return 指向不存在的第 257 个元素的指针。您需要 return 指向第一个元素的指针:
char * A::getInfo(){
return(&info[0]);
}
或者简单地说:
char * A::getInfo(){
return info;
}