【问题标题】:C string comparison [duplicate]C字符串比较[重复]
【发布时间】:2018-07-09 19:04:23
【问题描述】:

我一直在用 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;
}

【问题讨论】:

  • 你真的应该保存 C 风格的字符串以备后用。它们真的很复杂,在处理它们之前,您应该让自己对这种语言更加熟悉。
  • 我第一次看到这种方式。通常一个 c->c++ 程序员会卡住,我们说使用 std::string。这里一个 c++->c std::string-using 程序员使用 c 字符串卡住了
  • 简短回答:在 C 中,没有一个比较或关系运算符被定义为使用数组类型(字符串存储为char 的数组)。您必须使用strcmpstrncmp 库函数来比较字符串。

标签: c string loops while-loop


【解决方案1】:

你使用strcmp,很明显:

while (strcmp(c, "exit"))

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

orher 问题是您有一个四字节缓冲区用于五字节字符串,终止符字符需要适合。 C 在这种情况下非常棘手,您需要为人们可能输入的任何内容分配一个“足够大”的缓冲区,否则程序将立即崩溃。对测试程序使用 1024 或相当大的值。

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

【讨论】:

  • 我希望在测试中看到明确的!= 0
【解决方案2】:

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

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

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

+-----+-----+-----+-----+------+
| 'e' | 'x' | 'i' | 't' | '\0' |
+-----+-----+-----+-----+------+

where 'e' == 101, 'x' == 120, etc.

字符的值由ASCII Table的代码决定。

&command != "exit"

只是比较指针。

while(strcmp(command, "exit") != 0);

应该是正确的。 strcmp 当两个字符串相等时返回 0,非零 否则价值。见

man strcmp

#include <string.h>

int strcmp(const char *s1, const char *s2);

描述

strcmp() 函数比较两个字符串 s1s2。如果s1 是,它返回一个小于、等于或大于零的整数 分别发现小于、匹配或大于s2

但是你又犯了一个错误:

scanf("%c", &command);

这里您只读取 1 个字符,这个 command 不是字符串。

scanf("%s", command);

应该是正确的。

下一个错误是

char command[4];

这可以保存最大长度为 3 个字符的字符串,因此 "exit" 不会 适合缓冲区。

做起来

char command[1024];

然后你可以存储一个带有最大值的字符串。长度为 1023 字节。

一般来说,想要保存一个长度为n的字符串,需要一个char的数组 至少n+1 维度。

【讨论】:

  • 在字符串相同的情况下继续循环,0结果表示相同,或“没有区别”。
  • @tadman 是的,你是对的,我确定了答案。感谢您的反馈。
  • scanf( "%s", command ) ; 不需要 &。
【解决方案3】:

代码存在多个问题

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多