2010-09-25 93 views
0

我是C的新手,並且正在嘗試學習如何獲取字符串並使用函數打印它。我使用while(ch = getchar(), ch >= 0)在任何地方都可以看到示例,但只要我將它放入函數(而不是main())中,它就停止工作。現在,它陷入了無盡的循環......爲什麼是這樣?使用函數在C中打印字符串

// from main(): 
// printString("hello"); 

void printString(char *ch) 
{ 
    while (*ch = getchar(), *ch >= 0) 
    putchar(*ch); 
} 
+0

是否有一個原因,我們可以」不要使用printf? – KLee1 2010-09-25 16:47:33

+0

getchar()從標準輸入讀取輸入。你想要嗎,還是想打印「你好」? – 2010-09-25 16:55:47

+0

我實際上將通過解析一個垂直分隔欄文件爲15個字符的列來處理數據,但是我想將代碼從主體中拉出來放到一個函數中,我簡直窒息瞭如何遍歷一個來自stdin的字符串。 – bafromca 2010-09-25 17:02:32

回答

2

根據您的描述,您只是想:

void printString(char *ch) 
{ 
    while(*ch) { 
    putchar(*ch); 
    ch++; 
    } 
} 

您的原始功能:

void printString(char *ch) 
{ 
    while (*ch = getchar(), *ch >= 0) 
    putchar(*ch); 
} 

做了很多的東西:

  1. 從標準
  2. 存儲從標準輸入 讀取字符到第一個字符讀取字符由ch指出,(如果你在一個字符串通過這甚至可能沒有工作。
  3. 將字符寫入標準輸出。
  4. 當讀取的字符是< 0時終止(這在某些平臺上不起作用,因爲結果存儲在字符中,所以無法區分EOF和有效字符ch應該是一個int,因爲getchar )返回一個int,因此您可以檢查EOF)
+0

您也可以使用puts。 – 2010-09-25 16:57:12

+0

雖然沒有缺失的大括號。 – Porculus 2010-09-25 17:02:59

+0

當讀取字符<0時終止NOT;當讀取的字符是== 0時終止 – user411313 2010-09-25 18:49:10

0

我只想做printf("%s",str);puts(str);

+2

或'puts'。不要用大象槍殺死跳蚤。 – 2010-09-25 16:58:10

+0

它必須在一個函數中完成,因爲該函數將實際格式化字符串......對不起,如果我沒有正確解釋。 – bafromca 2010-09-25 16:59:01

+0

@本Voigt:這不是他一樣。 'puts'無條件地在末尾加上'\ n'。你可能需要它,或者你可能不需要它。 – AnT 2010-09-25 17:25:18

3

getchar()從標準輸入讀取用戶輸入。如果你想打印傳入的字符串,則不需要getchar()

讓我們一步一步來。你從循環中讀取一個字符,直到它到達文件結尾。這就是ch >= 0測試檢查的內容:只要我們獲得有效的字符,就繼續閱讀。爲了打印字符串的字符,條件會改變。現在一個有效的字符是不是NUL的('\0')。所以我們將環路條件改爲:

while (*ch != '\0') 

接下來是計算出循環體。 putchar(*ch)很好;我們會離開那裏。但是,如果沒有getchar(),我們必須弄清楚「獲取下一個字符」的等價語句是什麼。

那將是ch++。這將ch指針前進到字符串中的下一個字符。如果我們把它放在循環結尾,那麼我們將打印一個字符,前進一個空格,然後檢查下一個字符是否爲非NUL。如果是,我們打印它,提前,並檢查。

while (*ch != '\0') { 
    putchar(*ch); 
    ch++; 
} 
+0

雖然這是正確的,但它不是慣用的。大多數人會將'* ch!='\ 0''簡化爲'* ch',這意味着完全相同;也可以用一個命令'putchar(* ch ++);'來編寫主體 - 理解爲什麼在C中掌握'++'的行爲是必要的。 – Porculus 2010-09-25 17:04:07

3

這裏會發生什麼情況如下:

    在功能 main
  1. 你叫printString有一個指向字符串「hello」
  2. printString函數試圖與getchar()
  3. 讀取一個字符
  4. 並將該字符保存在'h'的位置

該語言的規則說,試圖改變'h'是未定義的行爲。如果你幸運的話,你的程序崩潰了;如果你非常不幸,它會出現該程序的作品。

總之:getchar()用於閱讀; putchar()用於書寫。

而你想寫5個字母:'h','e','l','o'和另一個'o'。

 
    hello 
    ^   ch is a pointer 
    ch   *ch is 'h' -- ch points to an 'h' 

之後有什麼東西最後'o'? 有! A '\0'。零字節終止字符串。因此,嘗試這種(與printString("hello");)...

void printString(char *ch) 
{ 
    putchar(*ch); /* print 'h' */ 
    ch = ch + 1; /* point to the next letter. */ 
        /* Note we're changing the pointer, */ 
        /* not what it points to: ch now points to the 'e' */ 
    putchar(*ch); /* print 'e' */ 
    ch = ch + 1; /* point to the next letter. */ 
    putchar(*ch); /* print 'l' */ 
    ch = ch + 1; /* point to the next letter. */ 
    putchar(*ch); /* print 'l' */ 
    ch = ch + 1; /* point to the next letter. */ 
    putchar(*ch); /* print 'o' */ 
    ch = ch + 1; /* point to the next letter. What next letter? The '\0'! */ 
} 

或者你可以寫在一個循環(從主呼叫使用不同的參數)...

void printString(char *ch) 
{ 
    while (*ch != '\0') 
    { 
     putchar(*ch); /* print letter */ 
     ch = ch + 1; /* point to the next letter. */ 
    } 
}