【问题标题】:Error in string do while [duplicate]字符串中的错误[重复]
【发布时间】:2018-01-10 03:28:25
【问题描述】:
char str[6];

do
{
    printf("Enter the string you wanna check:");
    scanf("%s", str);

}
while(str != "exit");

为什么这不起作用?

【问题讨论】:

  • 定义“不工作”
  • 当用户进入“退出”时,循环不会中断。
  • 你不是在比较字符串,而是指向char的指针。如前所述,使用strcmp()
  • 欢迎来到 StackOverflow!检查this out

标签: c


【解决方案1】:

str永远 等于 "exit",因为您正在比较两个不同内存部分的地址。您可能想要比较字符串的内容,其中有一个函数strcmp()

【讨论】:

    【解决方案2】:

    如上所述,使用<string.h> 头文件中的strcmp

    char str[6];
    
    do {
        printf("Enter the string you wanna check:");
        scanf("%s", str);
    } while(!strcmp(str, "exit"));
    

    【讨论】:

      【解决方案3】:

      "exit" 是编译器在数据段的某个地址处生成的char[5]。这个地址肯定和str的地址不同,因为两个不同的对象不能在内存中占据同一个位置。

      char[] 类型表达式之间的 != 运算符比较两个指针。这两个指针是"exit" 的地址和str 的地址,正如我已经解释过的,它们永远不会相等。

      因此,表达式str != "exit"永远不会计算为true。这给我们带来了另一点:您的编译器应该发出警告,说明这种情况总是错误的。这意味着您正在尝试在没有-Wall 的情况下进行编程。不要这样做,你永远不会走得太远。始终使用最高警告级别,当您看到警告时,始终修复它们

      要解决问题,请按照user3121023 建议的in a comment 操作,并使用strcmp() 比较字符串。

      【讨论】:

        【解决方案4】:

        试试:

        #include <stdio.h>
        #include <string.h>
        
        int main() {
        
            char str[6];
        
            do
            {
                printf("Enter the string you wanna check:");
                scanf("%s", str);
        
            }
            while(strcmp(str, "exit") != 0);
        
            return 0;
        }
        

        【讨论】:

          【解决方案5】:

          简短的回答是:它不起作用因为您必须使用strcmp(str, "exit") 来比较字符串并循环,只要strcmp() 的返回值不为0。

          长答案是:这个小代码片段还有更多问题:

          • 你读到一个单词的数组很短,你不限制字符的数量scanf()很可能存储在那里。任何超过 5 个非空格字符的用户输入都会导致未定义的行为。

          • 您没有检查scanf() 的返回值。文件过早结束,例如从空文件重定向输入,将导致无限循环。

          以下是如何以更安全的方式编写代码:

          #include <stdio.h>
          
          int main(void) {
              char str[80];
          
              for (;;) {
                  printf("Enter the string you wanna check:");
                  if (scanf("%79s", str) != 1 || strcmp(str, "exit") == 0)
                      break;
              }
              return 0;
          }
          

          【讨论】:

            猜你喜欢
            • 2012-12-24
            • 2017-06-24
            • 1970-01-01
            • 2015-12-30
            • 2017-12-07
            • 1970-01-01
            • 2019-03-26
            • 2018-12-25
            • 1970-01-01
            相关资源
            最近更新 更多