C语言,scanf问题与字符';s

C语言,scanf问题与字符';s,c,char,scanf,C,Char,Scanf,我正在使用c创建一个非常基本的程序。我使用scanf从控制台获取输入,但当我将其与char一起使用时,它似乎只是“跳过”了它 代码如下: #include <stdio.h> #include <string.h> int main(){ char name[20]; char yn; printf("Welcome to Benjamin's first C programme! \n\n"); do{

我正在使用c创建一个非常基本的程序。我使用scanf从控制台获取输入,但当我将其与char一起使用时,它似乎只是“跳过”了它

代码如下:

#include <stdio.h>
#include <string.h>


int main(){

    char name[20];
    char yn;

    printf("Welcome to Benjamin's first C programme! \n\n");


     do{

         printf("What is your name? \t");
         scanf("%s", name);
         printf("\n");

         printf("Is your name %s [y/n]?", name);
         scanf("%c", &yn);
         printf("\n");

     } while(yn != 'y');
}
#包括
#包括
int main(){
字符名[20];
查尔恩;
printf(“欢迎参加Benjamin的第一个C课程!\n\n”);
做{
printf(“你叫什么名字?\t”);
scanf(“%s”,名称);
printf(“\n”);
printf(“您的名字是%s[y/n]?”,姓名);
scanf(“%c”、&yn);
printf(“\n”);
}而(yn!=“y”);
}

在第二个
scanf()中的字符串格式开头添加空格。


此空格将捕捉在第一次输入后键入的换行符

在第二次输入的字符串格式开头添加空格scanf()


此空格将捕捉在第一次输入后键入的换行符

明显的跳过是因为%s说明符匹配字符串,直到出现空白或换行符。在这种情况下,它是一条新线。问题是它将其留在输入流中,而下一次读取将匹配它。因此,在yn变量中,始终存在换行符。为了防止出现这种情况,请在%c说明符之前插入空格,以处理所有空格(空格、换行符、制表符):


还请注意,出于同样的原因,如果我插入我的全名(即插入空格),您的程序将无法运行。

您明显的跳过是因为%s说明符匹配字符串,直到出现空白或换行符为止。在这种情况下,它是一条新线。问题是它将其留在输入流中,而下一次读取将匹配它。因此,在yn变量中,始终存在换行符。为了防止出现这种情况,请在%c说明符之前插入空格,以处理所有空格(空格、换行符、制表符):

还请注意,出于同样的原因,如果我插入我的全名(即插入空格),您的程序将无法运行。

作为替代方法,请尝试使用
getchar()

替换:

scanf("%c", &yn);  
与:

     getchar();//eat the '\n' from <return>
yn = getchar();  
getchar()//从中吃“\n”
yn=getchar();
作为记录我更喜欢其他答案,只是将此作为一种选择…

作为一种选择,尝试使用
getchar()

替换:

scanf("%c", &yn);  
与:

     getchar();//eat the '\n' from <return>
yn = getchar();  
getchar()//从中吃“\n”
yn=getchar();

记录在案我更喜欢其他答案,只是把它作为一种选择…

这个问题本周被问了无数次。还有前一周。在那之前的一周。答案在文档中。答案已经在Stackoverflow的某个地方了。只是说,我看不出投票被否决的理由。问题符合标准,陈述良好的问题,代码显示问题,陈述预期结果,以及它不起作用的地方。@Ryker虽然这次我没有投反对票,但我完全同意Vorspring。我记得我犯了所有这些初学者的错误,但你看不到我问过这样的问题——谷歌和网站搜索已经帮了我的忙。@H2CO3-同意并接受了我的观点。我也不记得问过任何我自己能弄明白的问题。但是,当我第一次开始编程时,谷歌仍然只是一个很大的数字:)。这是所有的书籍和编译器错误。现在,书籍(或在线教程)使用不足,人们还没有认识到编译器错误是他们真正的朋友。(总是欣赏你的观点,谢谢)这个问题本周已经被问了无数次了。还有前一周。在那之前的一周。答案在文档中。答案已经在Stackoverflow的某个地方了。只是说,我看不出投票被否决的理由。问题符合标准,陈述良好的问题,代码显示问题,陈述预期结果,以及它不起作用的地方。@Ryker虽然这次我没有投反对票,但我完全同意Vorspring。我记得我犯了所有这些初学者的错误,但你看不到我问过这样的问题——谷歌和网站搜索已经帮了我的忙。@H2CO3-同意并接受了我的观点。我也不记得问过任何我自己能弄明白的问题。但是,当我第一次开始编程时,谷歌仍然只是一个很大的数字:)。都是书和编译器的错误。现在,书籍(或在线教程)使用不足,人们还没有认识到编译器错误是他们真正的朋友。(总是欣赏你的观点,谢谢)这是应该做的。@H2CO3-谢谢,但是,你能扩展吗?我认为其他函数的优点在于它们的简洁。
scanf()
是一个可怕的函数。它的用法与直觉相反,它的工作方式与预期不符,它在概念上是错误的,因为它试图同时做两件本质上不同的事情(解析字符串和执行I/O),等等。
scanf()
几乎从来都不是一个合适的函数。如果需要逐字符输入,
getchar()
是正确的函数。如果一个人需要逐行输入,
fgets()
是一个不错的选择。@H2CO3-好吧,正如预期的那样,我并不希望你对此有明确的想法。谢谢分享。在将来的编码方法中,我也会记住这一点。这就是应该如何做到的。@H2CO3-谢谢,但是,你能扩展吗?我认为其他函数的优点在于它们的简洁。
scanf()
是一个可怕的函数。它的用法与直觉相反,它的工作方式与预期不符,它在概念上是错误的,因为它试图同时做两件本质上不同的事情(解析字符串和执行I/O),等等。
scanf()
几乎从来都不是一个合适的函数。如果需要逐字符输入,
getchar()
是正确的函数。如果需要逐行输入,