gpt4 book ai didi

c - 使用 scanf 时 getchar 不会停止

转载 作者:太空狗 更新时间:2023-10-29 17:08:23 25 4
gpt4 key购买 nike

我很难理解 getchar()。在下面的程序中,getchar 按预期工作:

#include <stdio.h>


int main()
{
printf("Type Enter to continue...");
getchar();
return 0;
}

但是,在下面的程序中,getchar 没有产生延迟,程序结束了:

#include <stdio.h>

int main()
{
char command[100];
scanf("%s", command );
printf("Type Enter to continue...");
getchar();
return 0;
}

我有以下奇怪的解决方法,它有效,但我不明白为什么:

#include <stdio.h>

int main()
{
char command[100];
int i;
scanf("%s", command );
printf("Type Enter to continue...");
while ( getchar() != '\n') {
i=0;
}
getchar();
return 0;
}

所以我的问题是:
1. scanf 是做什么的?为什么 scanf 这样做?
2. 为什么我的工作有效?
3. 什么是模拟以下 Python 代码的好方法:

raw_input("Type Enter to continue")

最佳答案

输入仅在您键入换行符后发送到程序,但是

scanf("%s", command );

在输入缓冲区中留下换行符,因为 %s(1) 格式在某些非空白之后遇到第一个空白字符时停止, getchar() 然后立即返回该换行符,无需等待进一步输入。

您的解决方法有效,因为它会在再次调用 getchar() 之前从输入缓冲区中清除换行符。

要模拟该行为,请在打印消息之前清除输入缓冲区,

scanf("%s", command);
int c;
do {
c = getchar();
}while(c != '\n' && c != EOF);
if (c == EOF) {
// input stream ended, do something about it, exit perhaps
} else {
printf("Type Enter to continue\n");
getchar();
}

(1) 请注意,在 scanf 中使用 %s 是非常不安全的,您应该将输入限制在您的缓冲区可以容纳的范围内一个字段宽度,scanf("%99s", command) 将最多读取 99 (sizeof(command) - 1)) 个字符到 command,为 0 终止符留出空间。

关于c - 使用 scanf 时 getchar 不会停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12653884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com