(作业问题)这个程序是为了大写每个字符串的第一个字母,但是我需要在输入后面加一个句点。我似乎无法做到这一点因为功能资本产生\ n由于某些原因我不知道。任何帮助,将不胜感激!我只需要那一点,我得到了其他一切。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int capital(char s[])
{
int i;
for(i=0; i<strlen(s); i++)
{
if (i==0||(s[i-1]==' '&&s[i]>='a'&&s[i]<='z'))
s[i]=toupper(s[i]);
}
printf("%s.", s);
return 0;
}
int main()
{
char s[100];
printf("Please enter a line of text > ");
fgets(s, sizeof(s), stdin);
capital(s);
return 0;
}
因此,例如我希望输出看起来像
Please enter a line of text > help me stackoverflow
Help Me Stackoverflow.
而不是现在
Please enter a line of text > help me stackoverflow
Help Me Stackoverflow
.
答案 0 :(得分:7)
fgets
保留换行符。
7.21.7.2 fgets功能
#include <stdio.h> char *fgets(char * restrict s, int n, FILE * restrict stream);
2
fgets
函数最多读取的次数少于n指定的字符数 从stream
指向的 stream 进入s
指向的数组。没有额外的 在换行符(保留)之后或文件结束后读取字符。一个 在读入数组的最后一个字符后立即写入空字符。
其他一些事情:
在终止条件下使用strlen是个坏主意 它使你的算法成为二次方,除非你的编译器成功确定字符串没有在循环中缩短,你真的不想依赖它。
改为测试s[i]
。
请注意,toupper
仅适用于具有单字节字符集的某些区域设置。
(对于iswhite
,您可能希望用它来检查空格。)
无论如何,因为你在调用之前已经检查过'a' - 'z',为什么不完成呢?
if ( (!i || s[i-1]== ' ') && s[i]>='a' && s[i]<='z')
s[i]+='A'-'a';
(顺便说一下:你的情况有点好奇。)
答案 1 :(得分:5)
来自docs(强调我的)
换行符使fgets停止读取,但该函数将其视为有效字符,并将包含在字符串中复制到str。
因此,当您尝试附加句点时,\n
已经在您的字符串中。您需要在字符串结尾之前插入句点,或者删除\n
,这将留给读者练习。