如何解决从 char[256] 属性的访问器返回 char[256]
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 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] = '\0';
}
成员函数getInfo
应该返回数组而不是不存在元素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
数组的内容,并且您的访问器返回了一个错误的指针。
在构造函数中,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);
}
至于访问器,它返回一个指向不存在的第 257 个元素的指针。您需要返回指向第一个元素的指针:
char * A::getInfo(){
return(&info[0]);
}
或者干脆:
char * A::getInfo(){
return info;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。