从'char *'到'char'的转换无效

时间:2010-10-14 22:21:52

标签: c++ string return-type

我的代码在编译时会返回错误invalid conversion from ‘char*’ to ‘char’,并将最后一行return char32标识为问题。我搜索了互联网和这个网站,但没有发现任何有帮助的东西。我发现错误消失了,如果我用return *char32替换问题行,代码会编译,但我不完全确定为什么会出现这种情况。我知道这是指针符号,但我不确定它们如何适用于这种情况。此外,当我这样做并尝试将*char32打印到终端时,没有任何反应,表明*char32为空。我还验证了确实从文件some file读入了一行。

更新1:我正在尝试从parse()返回完整数组。

更新2:我意识到我没有说明我的代码目标。我正在尝试从some file读取第一行,将其传递给parse(),并将前32个字符编入索引到数组char32,然后将其传递回{{1} }}。对困惑感到抱歉。

main()

6 个答案:

答案 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数组或指针。