C语言,scanf问题与字符';s
我正在使用c创建一个非常基本的程序。我使用scanf从控制台获取输入,但当我将其与char一起使用时,它似乎只是“跳过”了它 代码如下: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{
#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()
是正确的函数。如果需要逐行输入,