Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 警告:赋值从整数生成点而不强制转换_C_Warnings - Fatal编程技术网

C 警告:赋值从整数生成点而不强制转换

C 警告:赋值从整数生成点而不强制转换,c,warnings,C,Warnings,在我写的这段代码的最后一行,我得到了这个警告 int main(int argc, char **argv) { while(1) { char buffer[400]; char str; if(strcmp(argv[1],"start") == 0 ) { printf("myshell: process has started \n"); int i=0; while (str = strtok(buffer," ") =

在我写的这段代码的最后一行,我得到了这个警告

int main(int argc, char **argv)   
{
 while(1) {
char buffer[400];
char str;

if(strcmp(argv[1],"start") == 0 )
    { printf("myshell: process has started \n");
            int i=0;
            while (str = strtok(buffer," ") == NULL) {          
            argv[i] = str;  //**This line causes the warning!
是因为我如何声明str吗?这不对吗?谢谢大家!


正如标题所示,警告是警告:赋值从整数开始,不进行强制转换。

strtok()的原型是
char*strtok(char*str,const char*delim)
,则
strtok()
的返回值为
char*
,因此
str
的类型应为
char*


更重要的是,
str=strtok(buffer,”)==NULL
意味着
str=(strtok(buffer,”)==NULL)
,可能不是你想要的,我猜你的意思是
(str=strtok(buffer,”)==NULL
,我不确定这会导致强制转换错误,但我确实看到你的代码中有错误。对strtok的第一个调用会初始化令牌赋值器,因为您会向它传递一个缓冲区。第二个调用(假设您希望它找到下一个令牌)应该具有空值,而不是相同的缓冲区

所以你想要的是:

...
int i=0;
str = strtok(buffer, " ");
do {          
    argv[i] = str;  //**This line causes the warning!
    ...
} while (str = strtok(NULL, " ") != NULL);

请发布错误。您正在将
char
分配给
char*
。这不应该是你在这方面得到的唯一警告/错误。前一行同样糟糕,并且没有做你认为它做的事情。你少了一套参数。@WhozCraig我怎么能解决这个问题?我试着把char-str变成char*str,但不是这样。还有,是什么让你说更多的错误?我正在编译我的代码,这是我得到的唯一一个,我应该担心吗?@user3295674仅仅因为它编译了并不意味着它是正确的。例:while子句中的条件。它将表达式
strtok(buffer,“”==NULL
赋值给
char
变量。它不是将
strtok(buffer,”)
分配给
char*
,然后测试
NULL
…您还需要像WhozCriag提到的那样将“char str;”固定到“char*str”。最后一行中是否需要额外的括号(str=strok(NULL,”)?还有,这也行吗?int i=0;str=strtok(缓冲区“”);while(str==NULL){argv[i]=str;i=i+1;}是和否。“while(str==NULL){…”将永远不会进入循环,假设缓冲区至少有一个空间。对strtok的第一次调用返回指向第一个字符串的指针,而不是NULL。因此我认为您的意思是“while(str!=NULL){…”