#include<stdio.h>
#include<conio.h>
void sstring();
int main()
{
char ch1[10],ch2;
printf("Enter the value of first character : ");
scanf("%s",&ch1);
sstring();
getch();
return 0;
}
void sstring()
{ char ch2;
printf("Enter the value of second character : ");
scanf("%c",&ch2);
printf("Got the second character");
}
第二次扫描内部函数不起作用....程序不会在第二次扫描时停止?
答案 0 :(得分:1)
首先,那不是因为第二个scanf在函数内部。
这是因为第一个scanf(你输入的是)的0xA(返回)仍然在stdin缓冲区中。请注意,%s参数不会读取输入中的最后一个“\ n”。为了不影响以后对scanf的调用,你应该同时读取字符串和行分隔符。
char string[10], linedelim;
scanf("%s%c", string, &linedelim);
再来一遍你的例子,现在正在工作。
#include<stdio.h>
#include<conio.h>
void sstring();
int main()
{
char ch1[10],ch2, linedelim;
printf("Enter the value of first character : ");
// read both the string and line delim
scanf("%s%s",&ch1, &linedelim);
sstring();
getch();
return 0;
}
void sstring()
{ char ch2;
printf("Enter the value of second character : ");
// read the second input
scanf("%c",&ch2);
printf("Got the second character");
}
另请注意,您的示例非常脆弱,因为当用户输入超过10个字符时,它很容易导致缓冲区溢出。想象一下下面的命令行很容易破坏你的程序:
$ perl -e 'print "A" x 1000000' | ./a.out
比使用scanf()从输入读取字符串更好的方法可能是使用fgets(),因为您可以控制输入的大小。