C语言问题 请教高手!!!

2025-04-13 15:10:54
推荐回答(4个)
回答1:

这是摘自MSDN中关于scanf函数的%c指定符的解释中的一句话:
White-space characters that are ordinarily skipped are read when c is specified
翻译:当c指定时,通常跳过的空白字符会被读取

当你用"%d%c%s"读取一段文本,你输入"1 x ding”,‘1’后面的空格就会当做一个字符被读取,而x就被当做了一个字符串被读取。后面的" ding"就被留在了缓冲区,等待第二次执行scanf,但是" ding" 不与 "%d"匹配,所以scanf直接返回,随后调用的printf打印stu[i].name时就肯定出错,因为scanf还没有对他进行赋值。

解决方法:将 "%d%c%s"改成 "%d %c %s",但这样要求输入的内容必须用一个空格来分开。

你可以将for循环体改成:
int success_scan;
success_scan = scanf( "%d%c%s", &stu[i].num, &stu[i].sex, stu[i].name );
printf( "---\nsuccess_scan = %d\n---\n", success_scan );
printf( "%d%c%s\n", stu[i].num, stu[i].sex, stu[i].name );
来看看scanf的执行(scanf返回成功输入的个数)

回答2:

for( i=0; i<3; i++ )
{
scanf( "%d%c%s", &stu[i].num, &stu[i].sex, stu[i].name );
printf( "%d%c%s", stu[i].num, stu[i].sex, stu[i].name );
}
把这一段改成:
for( i=0; i<3; i++ )
{
scanf("%d", &stu[i].num);
setbuf(stdin, NULL);
scanf( "%c%s", &stu[i].sex, stu[i].name );
printf( "%d%c%s", stu[i].num, stu[i].sex, stu[i].name );
}
就可以了。
scanf读取字符的时候会读到前面输入的 回车,把输入流清空就可以,或者换成getchar()也可以

回答3:

这个主要是输入字符导致的问题!这种问题新手一般都不会注意!那就是当你读取完第一个整形后接下来输入的空格会被当成字符读入这样导致读取的时候与你的设想不同导致了问题!

回答4:

错误在于:%s不能与char name[20]匹配

试下:char name[20]改为char* name