2013-01-16 41 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