”); scanf(“%c”,命令(&c)); }while(&command!=“退出”); 返回0; },c,string,loops,while-loop,C,String,Loops,While Loop" /> ”); scanf(“%c”,命令(&c)); }while(&command!=“退出”); 返回0; },c,string,loops,while-loop,C,String,Loops,While Loop" />

C字符串比较 我在C++中编码,在C中完全新的。 为什么不起作用?我想通过键入exit来结束程序 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char command[4]; do{ printf( " -> " ) ; scanf("%c", &command); }while(&command != "exit"); return 0; } #包括 #包括 #包括 int main() { char命令[4]; 做{ printf(“->”); scanf(“%c”,命令(&c)); }while(&command!=“退出”); 返回0; }

C字符串比较 我在C++中编码,在C中完全新的。 为什么不起作用?我想通过键入exit来结束程序 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char command[4]; do{ printf( " -> " ) ; scanf("%c", &command); }while(&command != "exit"); return 0; } #包括 #包括 #包括 int main() { char命令[4]; 做{ printf(“->”); scanf(“%c”,命令(&c)); }while(&command!=“退出”); 返回0; },c,string,loops,while-loop,C,String,Loops,While Loop,显然,您使用: while (strcmp(c, "exit")) 您的代码所做的是将输入缓冲区的地址与静态字符串的地址进行比较“exit”,这当然永远不会匹配。必须在指针处比较字符 while(strcmp(command, "exit") != 0); 另一个问题是,对于一个五字节的字符串,您有一个四字节的缓冲区,终止符需要适合。C是非常棘手的,这种方式,你需要分配一个“足够大”的缓冲区,无论人们可能键入什么,否则程序将立即崩溃。测试程序使用1024或相当大的值 现在我说“显然”,是因为

显然,您使用:

while (strcmp(c, "exit"))
您的代码所做的是将输入缓冲区的地址与静态字符串的地址进行比较
“exit”
,这当然永远不会匹配。必须在指针处比较字符

while(strcmp(command, "exit") != 0);
另一个问题是,对于一个五字节的字符串,您有一个四字节的缓冲区,终止符需要适合。C是非常棘手的,这种方式,你需要分配一个“足够大”的缓冲区,无论人们可能键入什么,否则程序将立即崩溃。测试程序使用1024或相当大的值


现在我说“显然”,是因为在编写C代码时,您应该始终打开一个窗口,以确保您使用的函数和参数正确,并知道您有哪些可用的工具。

因为在C中,您必须使用strcmp进行字符串比较

在C语言中,字符串是以
'\0'
-终止字节结尾的字符序列,其值为0

字符串
“exit”
在内存中看起来像这样:

+-----+-----+-----+-----+------+
|“e”|“x”|“i”|“t”|“\0”|
+-----+-----+-----+-----+------+
其中‘e’==101,‘x’==120,等等。
字符的值由字符的代码决定

只是比较指针而已

while(strcmp(command, "exit") != 0);
这是正确的<当两个字符串相等时,code>strcmp返回0,即非零 否则的话,我会很珍惜的。看

人马骑警

这里您只读取1个字符,此
命令
不是字符串

scanf("%s", command);
这是正确的

下一个错误是

char command[4];
这可以保存最大长度为3个字符的字符串,因此
“exit”
不会 放进缓冲器里

成功

char command[1024];
然后可以存储最大长度为1023字节的字符串

通常,如果要保存长度为
n
的字符串,您需要一个
char
数组
至少
n+1
维度。

代码存在多个问题

  • 您需要五个字符而不是四个字符才能包含结尾的空字符
    \0
  • 您应该使用
    %s
    输入字符串<代码>%c用于字符
  • 您正在比较while循环中的内存位置(或指针)。您需要
    strcmp
    来比较字符串

  • 这将继续循环,而字符串是相同的,0结果表示相同,或“没有差异”。@tadman是的,你是对的,我修复了答案。感谢您的反馈。
    scanf(“%s”,命令)不需要-。@Clifford感谢您的反馈,我只是复制粘贴并从
    %c
    更改为
    %s
    ,而没有查看行的其余部分。您真的应该保存c样式的字符串以备以后使用。它们真的很复杂,在处理它们之前,你应该让自己对语言更加熟悉。这是我第一次这样看待它。通常情况下,c->c++程序员陷入困境,我们说使用std::string。在这里,使用c++->c std::string的程序员使用c stringsShort回答:在c中,没有一个比较运算符或关系运算符被定义为使用数组类型(字符串被存储为字符数组)。您必须使用
    strcmp
    strncmp
    库函数来比较字符串。我希望看到显式的
    !=测试中的0
    char command[4];
    
    char command[1024];