2011-12-26 106 views
0
int main() 
    { 
     char str[200]; 
     int n,tc; 
     scanf("%d",&tc); 
     while(tc--) 
     { 
      scanf("%d",&n); 
      gets(str); 
      puts(str); 
     } 
    return 34; 
    } 

爲什麼此代碼沒有掃描號碼。字符串(str)等於tc?
平臺UBUNTU 10.04c中的掃描字符串

+1

主要的聲明後,空間不應該是這樣的...你有什麼要完成? – 2011-12-26 20:27:15

+1

這是可怕的代碼。你爲什麼要在'tc'(應該是'char **'類型)中做第一個'scanf'參數? – 2011-12-26 20:27:59

+0

我們可以在main(), – 2011-12-26 20:28:41

回答

1

允許在同一時間(或多或少)分解一行代碼:

scanf("%d",&tc); 

讀取的整數成TC

while(tc--) 

環路TC倍

scanf("%d",&n); 

讀取的整數爲n個

gets(str); 

讀取的行的其餘部分成str,刪除尾部換行符

puts(str); 

打印出字符串,緊接着換行

所以你讀一個整數,然後讀取那麼多整數+其餘的行對和打印出行(但不是整數 - 它們會被扔掉)。讀取一個整數需要在整數之前跳過任何空格(空格,製表符和整個空行),但在整數之後不會有任何空格,所以這可能有點令人困惑,這取決於您提供給程序的輸入類型。

在你的榜樣,你說你餵養它的輸入:

3 
4 
anil kuma 
2 
abc 
4 
ams 

所以讓我們去通過該計劃,看看它做什麼:

  • 閱讀整數3到TC
  • loop 3 times
  • (first loop)
    • 讀取4成n
    • 讀取線(空白)到str的其餘部分,
    • 打印空白行
  • (第二循環)
    • 嘗試讀取的整數爲n個,但輸入(anil kuma)不是整數,所以設置錯誤標誌在stdin
    • 讀取線(anil kuma)的其餘部分成STR
    • 打印anil kuma
  • (三環路)
    • 2成n
    • 讀取線(空白),其餘爲str
    • 打印空白行
  • 循環完成,回退出碼34.

你從來不檢查重打開的功能或標準輸入錯誤代碼值,讓你有想在第二次迭代讀一個整數的錯誤其實是完全不可見。

你可能會得到一個輸出更喜歡你正在改變你的scanf期待什麼叫到:

scanf("%d ", &n); 

注意:%d轉換後的額外空間,從而導致scanf函數讀取和扔掉whiltespace直到找到一個非空白字符。這將導致它扔掉整數後的換行符,以及任何後續的空行和任何空白/製表符在下一個非空行

+0

得到它,在掃描期間%d之後需要空間n。 – 2011-12-26 21:20:34

+1

請注意,%d之後的空格具有其他效果 - 即跳過空白行 - 您可能會也可能不會在意。 – 2011-12-27 02:10:40

3

在這裏我得到我的機器上:

[email protected]:~/tmp$ cc whoa.c 
whoa.c: In function ‘main’: 
whoa.c:4: warning: incompatible implicit declaration of built-in function ‘scanf’ 
/tmp/cc1r5dZe.o: In function `main': 
whoa.c:(.text+0x4b): warning: the `gets' function is dangerous and should not be used. 
[email protected]:~/tmp$ ./a.out 
3 
12qwe 
qwe 
34asd 
asd 
56zxc 
zxc 

如此看來,它會掃描。

看來你正在使用K & R C,但這不是個好主意。使用ANSI/ISO C標準。

  1. 有沒有#include <stdio>,和程序的開始。需要使用scanf(),gets()puts()。使用可變參數函數時尤其必要,如printfscanf(因此我的編譯器會抱怨)。
  2. 您沒有爲main()聲明參數類型。主要有原型int main(int argc, char *argv[])
  3. 您使用函數參數作爲局部變量,最好在函數體中聲明它們。您必須在{之後有:int tc;int n;
  4. 從main()返回的可能值在<stdlib.h>中定義,可以是EXIT_SUCCESSEXIT_FAIL或常用的0或1(當然,您可以使用其他值,但您必須確保它們在您的環境中有意義。
+0

哦,看起來這只是因爲代碼太奇怪了。 – Vovanium 2011-12-26 21:16:41

1

我知道了,錯誤在行

scanf("%d", &n); 

它需要%d

scanf("%d ", &n);