我正在学习C,如果这个问题看似简单或新手,那么你就知道为什么了。在发布此问题之前,我已经在这里搜索了SO。似乎有很多它们但它们不是关于C,而是Java,php和其他。
我正在研究一个简单的程序,它必须转换每个单词大写的第一个字符。例如,如果输入是:
你好我的名字是克劳迪奥
输出将是
您好我的名字是Claudio
这是我到目前为止的编码:
#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 = ' ';
但这似乎都不是正确的方法。 目前我处于死胡同。有人可以告诉我如何完成我想要做的事情吗?
答案 0 :(得分:3)
您只需在连接转换后的字符串后连接空格:
strcat(sentence2,token);
strcat(sentence2," ");
答案 1 :(得分: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';
答案 2 :(得分:0)
您可以添加此行以将空格放回
while(token != NULL)
{
*token = toupper(token[0]);
strcat(sentence2,token);
token = strtok(NULL," ");
if (token)
strcat(sentence2, " ");
}