2013-01-16 42 views
0
#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"); 
    } 

第二个scanf里面的函数不起作用....程序不停止在第二个scanf上?第二个scanf里面的函数不起作用....程序不停止在第二个scanf?

+1

请注意,虽然你声明了'sstring()',你没有为它指定一个原型。在C(但不是C++)中,形式'sometype function();'的声明声明了返回'sometype'的函数的存在,但是没有指定参数列表(但它不是可变长度参数列表)。要为不带参数的函数声明一个函数原型,写'sometype function(void);'。为了一致性,我建议用明确的'(void)'符号来定义函数。 –

+1

另外,检查'scanf()'的返回值是确定它成功的一个好主意。例如,你可以使用'if(scanf(“%9s”,ch1)!= 1)...读取失败...'。请注意数组名称中缺少'&'。从技术上讲,你传递的是一个数组(char(*)[10]')类型的数组地址,而不是'scanf()'所期望的char *。你的编译器应该警告类型不匹配;如果不是的话,找出如何让它这样做或得到一个更好的编译器。然后注意警告! –

+0

你能为我推荐一个好的编译器,用于C和C++的Windows ...请分享我从哪里可以得到它的链接... – kks

回答

1

首先,这并不是因为第二个scanf在函数内部。

那是因为从第一个scanf(您键入enter)的0xA(返回)仍然在标准输入缓冲区中。请注意,%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(),你有超过输入的大小控制。

+0

所以在每次scanf之后,我们需要把fflush?....我的意思是在哪里使用fflush,哪里不是? – kks

+0

@kks忘记我之前提到过的fflush。输入流上的fflush()将导致未定义的行为。使用另一个scanf()吃换行符 – hek2mgl

+0

有没有其他方法可以做同样的事情?我的意思是如果有一些其他函数,这样可以避免两个scanf语句并且程序正确运行 – kks