2016-01-21 66 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

相关问题