【问题标题】:GCC Complaint -- Assignment makes integer from pointer without a castGCC 投诉 - 赋值从指针中生成整数而不进行强制转换
【发布时间】:2011-02-21 02:24:33
【问题描述】:

我正在尝试删除fgets() 附加的尾随\n 字符。我将这个字符替换为一个以字符结尾的字符串\0

为什么编译器会报错:“Assignment make integer from pointer without cast”。

word[strlen(word) - 1] = "\0";

如果需要一些上下文,这里有一个更完整的代码示例。

FILE *wordFile = fopen("/temp/words.txt", "r");
char word[100];
while (fgets(word, 100, wordFile)) {
    // Strip off the trailing the \n so it is not counted
    // as part of the string length
    word[strlen(word) - 1] = "\0";
    :
}

【问题讨论】:

  • 我闻到了假代码。我打赌你写的是"\0"而不是'\0'...
  • 哈!我是这个 IDE 的新手。显然我的更改没有保存。我确实首先有“\ 0”。我纠正了这个问题,但显然我没有重建。
  • 如果您的单词中没有'\n'(例如,输入以EOF 结束或在没有'\n' 的情况下达到您的缓冲区大小),它会很高兴地砍掉您的最后一个字符字。
  • @sarnold:啊,这就是为什么 C 标准说如果源文件没有被换行符终止,行为是未定义的!这样编译器就可以使用此代码;-)

标签: c


【解决方案1】:

你的问题在于陈述:

word[strlen(word) - 1] = "\0";

这是试图将指针分配给数组元素的C字符串,整数类型char,因此出现错误消息"Assignment makes integer from pointer without cast"

你应该写的是:

word[strlen(word) - 1] = '\0';

将一个字符分配给数组元素。

顺便说一句,您应该注意长度超过(大约)100 个字符的行。您只会阅读该行的第一部分,它不会在末尾 有一个换行符,并且您将在下次通过循环时将该行的其余部分作为单独的行来阅读 (如果您有一条线,例如 1K 长,这可能会发生 很多次

对于它的价值,您可以使用以下代码来解决这些问题:

if ((s = strlen (word)) > 0) {
    if (s[s-1] != '\n') {
        // Line was too long, do something intelligent.
    } else {
        s[s-1] = '\0';
    }
}

【讨论】:

  • Thanys 为编辑感到高兴,@Antti,我不敢相信(1)我犯了这样一个愚蠢的错误; (2) 在过去的七年多时间里没有人拿起它:-)
猜你喜欢
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 2023-02-08
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
相关资源
最近更新 更多