【问题标题】:Why use getchar in specific line? [closed]为什么在特定行使用 getchar? [关闭]
【发布时间】:2021-05-29 13:32:11
【问题描述】:

如果第 5 行的 getchar() 没有被使用,为什么下面的代码在一轮之后就被终止了?

char s;
while(1){
    printf("Enter two integers: ");
    scanf("%d%d",&a,&b);
    getchar();
    c = a + b;
    printf("Addition of %d & %d is %d\n",a,b,c);
    printf("Add more numbers(yes/no): ");
    scanf("%c",&s);
    if(s == 'y')
        continue;
    else
        break;
}

为什么在下面的代码中使用字符串不起作用?我已经包含了 文件。

char s[10];
while(1){
    printf("Enter two integers: ");
    scanf("%d%d",&a,&b);
    getchar();
    c = a + b;
    printf("Addition of %d & %d is %d\n",a,b,c);
    printf("Add more numbers(yes/no): ");
    scanf("%s",s);
    if(s == "yes")
        continue;
    else
        break;
}

【问题讨论】:

  • s == "yes" 您告诉编译器仅将 y(数组指向的第一个字符)与 yes 字符串文字进行比较,这是不匹配的。您需要使用strcmp()
  • @RohanBari 不是,这里发生了什么。比较中不涉及y。此比较采用数组s 的地址,并与字符串文字"yes" 的地址进行比较,后者永远不会为真。
  • 试试(第一版)if (s == 'y') { continue; } else { printf("s is %d\n", s); break; }
  • 不要问多个问题。专注于一个。
  • 如果你只使用变量s,你引用的不是数组中的第一个字符而是数组本身。它衰减为指向第一个元素的指针。但是由于您前面没有*,因此您不会取消引用它。因此s 表示s 所在的地址(可能在堆栈上)。左侧是指针。在右侧发生类似的事情。 "yes" 是一个字符串文字并衰减为指向第一个字符的指针。但同样,你不要取消引用它。最后你比较了两个不能指向同一个地址的指针。

标签: c string loops char


【解决方案1】:

当您输入第一个 scanf("%d%d",&a,&b) 时,您可能使用 Enter 键结束。

Enter 键作为换行符添加到 scanf 读取的输入缓冲区中。

如果您没有getchar() 调用,那么该换行符就是下一个scanf("%c",&s) 将读取的内容。

正如您所指出的,一种解决方案是使用getchar() 来读取并丢弃换行符。另一种解决方案是让scanf 做同样的事情:

scanf(" %c",&s);
//     ^
// Note the space here!

前导空格告诉scanf 跳过并忽略所有前导空白字符,其中换行符就是这样一个字符。

请注意,scanf 的大多数格式说明符会自动跳过并忽略前导空格。例如%s 会这样做,这意味着您使用scanf("%s",s) 的第二个版本不需要getchar() 调用。

另请注意,这应该很容易推断出来,方法是在调试器中花费 5 分钟时间,在监控变量及其值的同时逐句执行代码。


然后是s == "yes"。这里发生的是数组s 将衰减为指向其第一个元素的指针,文字字符串也是如此,然后您比较这些指针以查看它们是否相同,它们很可能永远不会相同。

这有点简化了:

char yes_literal[4] = "yes";
if (&s[0] == &yes_literal[0]) ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多