我的代码在编译时会返回错误invalid conversion from ‘char*’ to ‘char’
,并将最后一行return char32
标识为问题。我搜索了互联网和这个网站,但没有发现任何有帮助的东西。我发现错误消失了,如果我用return *char32
替换问题行,代码会编译,但我不完全确定为什么会出现这种情况。我知道这是指针符号,但我不确定它们如何适用于这种情况。此外,当我这样做并尝试将*char32
打印到终端时,没有任何反应,表明*char32
为空。我还验证了确实从文件some file
读入了一行。
更新1:我正在尝试从parse()
返回完整数组。
更新2:我意识到我没有说明我的代码目标。我正在尝试从some file
读取第一行,将其传递给parse()
,并将前32个字符编入索引到数组char32
,然后将其传递回{{1} }}。对困惑感到抱歉。
main()
答案 0 :(得分:4)
char32
的类型是char (*)[32] (which degenerates to char *),即32个字符的数组。这与单个字符char
完全不同。如果要返回整个数组,请更改返回类型。否则,只返回一个字符:char[x]
其中x是所需的索引。
答案 1 :(得分:3)
编译器告诉你错误。你说parse返回一个char。
char parse(....
char32是一个字符数组;字符数组的类型为char *。
所以当你去
return char32;
你与之前所说的相矛盾
什么应该解析返回 - 一个字符或一组字符?选择一个并保持一致
答案 2 :(得分:2)
这里有很多问题。
如果你真的想要返回一个应该是
的单个字符return char32[0];
或索引所需的任何字符。顺便说一下,这与* char32相同。如果没有使用索引,则可以将数组变量视为指向元素中第一个数组的指针。虽然char32
是全局的,但它并没有真正在函数返回void之外添加任何值 - 调用者只能直接访问char32
。如果您想使用cout
输出结果,最好从string
返回新的parse
。
当你达到min(大小,32)时,你应该在parse
中停止循环,否则你将在line
中使用未定义的结果(通常是坏的)超出输入字符串。在这里为空终止符提供空间是个好主意 - 再次使用字符串只会避免这种情况。
魔法数字是邪恶的。使用此代替硬编码32:
const size_t MAX_LENGTH(32);
如果所有解析都是逐字节复制,您可以使用std::copy
但我怀疑这是一个原型,用于解决接口问题后您计划构建的实际解析器。在您顺便将char myresult = parse(line);
输出到char32
之前,我认为您错过了对cout
的来电。
答案 3 :(得分:2)
您的函数返回char类型,但Char32的类型为char *。从你想要做的事情来看,你想要改变你的函数的返回类型。
答案 4 :(得分:2)
我可以看到很多问题。其中一些已被其他人提及过。
1)parse()
的返回类型为char
,但您返回的是char*
2)parse()
函数对myString.c_str();
表示字符串为char数组,或myString.copy(char32, 32);
方法将字符串的前32个字符复制到阵列。 (请注意,最后一个char不会是指示字符串结尾的空终止字符'\0'
)
3)您的代码实际上从未将输入数据放入char32。你忘记了像这样的主线:char* char32 = parse(line);
总而言之,通过执行以下操作可以改善您的代码:
int main()
{
string line;
ifstream vgv;
vgv.open("some file");
if(!vgv)
return 1; // failure
getline(vgv, line);
char* char32 = new char[32];
line.copy(char32,31);
char32[31] = '\0'; //Ensure that the string is actually terminated
cout << char32;
delete [] char32;
return 0; // success
}
我提出的主要问题是,如果行的数据少于31个字符,则在打印char32时会看到垃圾数据。因此,最好使用以下内容替换char32[31] = '\0'
:
int size = line.size();
char32[(size > 31) ? 31 : size] ='\0';
最后,如果您想在char32
中找到数据的大小,可以这样做:
int size = 0;
while(char32[size++] != '\0' && size < 32){} // gets size of the valid data within char32
- 更新 -
如果你真的想使用解析功能,这是我最好的推荐。
char* parse(string line, int quantity)
{
char* rtn = new char[quantity];
line.copy(rtn, quantity-1);
int size = line.size();
rtn[(size > quantity-1) ? quantity-1 : size] = '\0';
return rtn;
}
int main()
{
string line = "asdfsadfsdaf";
char* myDataOne = parse(line, 32);
char* myDataTwo = parse(line, 5);
cout << myDataOne << endl;
cout << myDataTwo << endl;
delete [] myDataOne;
delete [] myDataTwo;
return 0; // success
}
答案 5 :(得分:1)
虽然我不清楚你想用这段代码实现什么,但我会在句法上解决这个问题。
如声明的那样, char parse()
返回char
,即单个字符。如果您希望它返回一个字符数组,您应该将返回值更改为char*
。这样你就可以做return char32;
。否则,您必须通过索引从数组char32
中选择一个字符。 *char32
将等同于char32[0]
。
最后请注意,在C ++中,您最好坚持使用std::string
而不是普通的char
数组或指针。