【问题标题】:strcmp() not returning what it should returnstrcmp() 没有返回它应该返回的内容
【发布时间】:2019-04-27 10:48:37
【问题描述】:

基本上,我想创建一个程序,其中包含可能出现在我即将进行的数字系统考试中的潜在问题。

#include <stdio.h>
#include <string.h>
int main() {
    char input1[600];
    printf("What is the set of available registers?");
    scanf("%s", &input1);

    if(strcmp(input1, "registers, memory, hard disc") == 0){
        printf("Good job! You got it right");
    }
    else {
        printf("Wrong answer!");
    }

所以每当我被问及输入“寄存器、内存、硬盘”时,它都会返回 1 而不是 0。我看不到问题所在。如果这是一个愚蠢的问题,我对 C 有点陌生,很抱歉。

【问题讨论】:

  • 在这种情况下,您应该打印您已阅读的字符串以查看其中包含的内容。这是基本的调试。
  • scanf 著名(是的;这是设计使然)分隔空间上的输入。
  • “标准库函数 X 的行为不符合其文档”几乎总是误诊。更有可能的是输入不是您认为的那样(如这里),甚至您误解了文档。
  • 调用了未定义的行为,因为%s 需要char*,但显示的代码传递了char**。任何事情都有可能发生。

标签: c string string-comparison strcmp


【解决方案1】:

剑鱼已经给出了很好的答案,fgetsscanf 更可取。但是,我想展示在这种情况下您将如何使用 scanf

if(scanf("%599[^\n]", input1) != 1) {
    // Handle error
}

那么有什么不同呢?

  1. scanf 返回成功分配的数量,因此如果返回 1,则 input1 已分配。如果不是,则发生错误。
  2. s 更改为 [^\n] 以读取到换行符
  3. 已插入599(小于 600 之一),因此请确保我们不会在数组之外写入。
  4. input1 中删除了&amp;。在这种情况下,它可能无论如何都会起作用,但它是未定义的行为,应该不惜一切代价避免。

【讨论】:

    【解决方案2】:

    尝试从以下位置更改您的 scanf 行:

    scanf("%s", &input1);
    

    到:

    scanf("%[^\n]", input1);

    这对我有用。

    【讨论】:

      【解决方案3】:

      正如 cmets 中已经说过的,scanf()"%s" 在第一个空白字符处停止转换。要阅读整行文本,请使用fgets()

      #include <stddef.h>
      #include <stdio.h>
      #include <string.h>
      
      // ...
      
      char foo[100];
      if(!fgets(foo, sizeof(foo), stdin))  // don't use sizeof on pointers
          ; // handle error                // for that purpose!
      
      size_t length = strlen(foo);
      if(length && foo[length - 1] == '\n')  // fgets also reads the newline character 
         foo[--length] = '\0';               // at the end of the line, this removes it.
      

      【讨论】:

      • 很好地使用fgets() 和很好的测试来防止黑客利用输入空字符作为第一个字符。
      • 不错的一个。 fgets 当然更可取,但我添加了一个关于如何处理 scanf 的答案
      猜你喜欢
      • 2022-11-03
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多