【问题标题】:How do I handle these C warnings?如何处理这些 C 警告?
【发布时间】:2013-03-30 19:20:47
【问题描述】:

所以,我在编译 C 文件时收到了一些警告,我不知道如何修复。

第一个警告来自以下代码:

char line[100];
char* carbonCopy;
char *currentWord;
wordlist *theList = malloc(sizeof(wordlist));
theList->head->string = NULL;
word *fromFile = malloc(sizeof(word));

while(fgets(line,99,file)){
    if(line != NULL){
        carbonCopy = line;

        while((currentWord = strsep(&line, " ")) !=NULL)
        {
            malloc(strlen(currentWord)*sizeof(char));
            fromFile->string = currentWord;
            fromFile->next = malloc(sizeof(word));

警告指出:

从不兼容的指针类型传递“strsep”的参数 1 [默认启用]

【问题讨论】:

  • 这与您的问题无关,但strlen 的运行时间为 O(n),因此在循环条件下使用它通常是个坏主意。
  • 尝试使用 string.h 和 stdlib.h

标签: c warnings variable-assignment declaration implicit


【解决方案1】:

您需要包含声明strsepstrlen 的标头

#include <string.h>

【讨论】:

  • 我确实忘记了,谢谢。话虽如此,我收到一条警告,指出传递给 strsep 的第一个参数是不兼容的指针类型。
  • 您能否更新您的问题以显示更多代码,尤其是 line 的类型?
  • 是的,我会更新问题,因为之前的警告已经不存在了,给我一秒钟
【解决方案2】:

strsep() 需要 char ** 作为第一个参数,但您的来源使用 char (*)[100]

像这样修改你的代码:

char line[100];
char * carbonCopy;

...

carbonCopy = line;
while((currentWord = strsep(&carbonCopy, " ")) !=NULL)

请注意carbonCopy不是line的副本,而只是对其的引用,也就是说,它指向line包含的数据。


这一行

malloc(strlen(currentWord)*sizeof(char));

没有效果,但是浪费内存。

【讨论】:

  • @user1795374:无论如何,我们只看到很少的代码可以真正为您解决问题。
  • 我应该让 carbonCopy 成为一个字符**吗?我将它从 line 切换到 carbonCopy 得到了相同的结果
  • 我打赌你错过了领先的&amp;
  • 地址运算符&amp;char * 生成char **,所以char * charbonCopy; ... strsep(&amp;charbonCopy, ... 应该可以工作。
  • 它没有。我有你建议的完全相同的东西,但错误仍然是一样的
猜你喜欢
  • 2020-07-21
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 2019-01-30
  • 2017-10-18
相关资源
最近更新 更多