我似乎无法理解在这个C程序中创建下一行的原因

时间:2014-12-05 23:44:28

标签: c

(作业问题)这个程序是为了大写每个字符串的第一个字母,但是我需要在输入后面加一个句点。我似乎无法做到这一点因为功能资本产生\ 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
.

2 个答案:

答案 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指向的数组。没有额外的   在换行符(保留)之后或文件结束后读取字符。一个   在读入数组的最后一个字符后立即写入空字符。


其他一些事情:

  1. 在终止条件下使用strlen是个坏主意 它使你的算法成为二次方,除非你的编译器成功确定字符串没有在循环中缩短,你真的不想依赖它。

    改为测试s[i]

  2. 请注意,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,这将留给读者练习。