2016-01-21 89 views
3

我正在學習C,如果這個問題看起來很簡單或者是新手,那麼你知道爲什麼。在發佈這個問題之前,我已經在SO上搜索過。似乎有很多,但它們不是關於C,而是Java,php和其他。將句子中每個單詞的第一個字符轉換爲大寫

我正在研究一個簡單的程序,它必須轉換每個單詞大寫的第一個字符。例如,如果輸入的是:

你好我的名字是克勞迪奧

輸出將

我的名字是克勞迪奧

這是我的編碼到目前爲止:

#include <stdio.h> 
#include <string.h> 

int main(void){ 

     char sentence[21] = {'\0'}, sentence2[21] = {'\0'}, *token = NULL; 

     fgets(sentence,21,stdin); 

     token = strtok(sentence," "); 

     while(token != NULL) 
     { 
       *token = toupper(token[0]); 
       strcat(sentence2,token); 
       token = strtok(NULL," "); 
     } 

     puts(sentence2); 

return 0; 

} 

輸出是:

MyNameIsClaudio

顯然,這不是我所期待的,如上所述。我以爲我會一直能夠解決簡單地增加一個空間,這樣的問題:

token[strlen(token)+1] = ' '; 
strcat(sentence2,token); 

但同樣,輸出是不是一個預期:

MyAmeSLaudio

因此,爲了達到我想要的結果,我嘗試過:

null_char = strrchr(token,'\0'); 
*null_char = ' '; 

但是,似乎是正確的方法。 目前我處於死路一條。有人能告訴我如何完成我想要做的事嗎?

+2

瀏覽句子[]'數組,並對每個字母后面的空格,確保它是大寫。 – chux

+1

'char句子[21]'對於輸入樣本很小。 '擦'錯字作爲'句子' – BLUEPIXY

+0

@BLUEPIXY固定代碼。感謝您找出錯字。用一種語言思考並不容易,在另一種語言中寫作和閱讀並尋找錯誤:P –

回答

3

你只需要串聯轉換後的字符串後串連一個空間:

strcat(sentence2,token); 
strcat(sentence2," "); 
0

您可以只添加這條線把空間重新

while(token != NULL) 
    { 
      *token = toupper(token[0]); 
      strcat(sentence2,token); 
      token = strtok(NULL," "); 
      if (token) 
       strcat(sentence2, " "); 
    } 
3

替代:步行數組

strtok()失去空格分隔符。這種方法維護着一組空間。

走過sentence[]數組,對於空格後的每個字母,確保它是大寫字母。

fgets(sentence1, sizeof sentence1, stdin); 

int precious_space = 1; 
size_t len = strlen(sentence1); 
for (size_t i = 0; i <= len; i++) { 
    sentence2[i] = previous_space ? toupper((unsigned char) sentence1[i]) : sentence1[i]; 
    precious_space = sentence1[i] == ' '; 
} 
fputs(sentence2, stdout); 

替代循環。請參見@l3x

size_t i 
for (i = 0; sentence1[i]; i++) { 
    sentence2[i] = previous_space ? toupper((unsigned char) sentence1[i]) : sentence1[i]; 
    precious_space = sentence1[i] == ' '; 
} 
sentence2[i] = '\0'; 
+1

'strlen()'也不需要:'for(size_t i = 0; sentence1 [i]; i ++)'會也做。 –

+0

你是說「strtok()失去空格分隔符」是什麼意思?我發現的令牌不是以null結尾的? –

+0

@ l3x真 - 幾乎。如果使用'sentence1 [i]'的代碼需要附加到'sentence2'。對於OP來說,這樣想法會更清楚。 – chux

相關問題