strcmp() 没有 return 它应该 return

strcmp() not returning what it should return

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

#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!");
    }

所以每当我输入 "registers, memory, hard disc" 当我被问到 returns 1 而不是 0 时。我看不出问题所在。我是 C 的新手,如果这是一个愚蠢的问题,我很抱歉。

如评论中所述,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] = '[=10=]';               // at the end of the line, this removes it.

尝试更改您的 scanf 行:

scanf("%s", &input1);

至:

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

它对我有用。

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

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

那么有什么不同呢?

  1. scanfreturns成功赋值的次数,所以如果这个returns1,那么input1已经赋值了。如果不是,则发生错误。
  2. 已将 s 更改为 [^\n] 以读取到换行符
  3. 已插入599(600个以内)所以保证不写到数组外
  4. 已从 input1 中删除 &。在这种情况下,它可能无论如何都会起作用,但这是未定义的行为,应该不惜一切代价避免。