fgets() 在字符串中包含新行

fgets() includes new line in string

我从我的文档中提取了单词,并将所有单词打印在屏幕上,但是在打印每个单词之后都有一个空行。如何避免读取或将这一新行添加到字符串中?

int main(void) {
    FILE *f;
    f = ("words", "r");
    char string[100];
    while (fgets(string, 100, f)) {
         printf("%s", string);
    }
}

这段代码不是复制粘贴的,所以我可能忘记了一些小片段,但应该可以。在 words.txt 中,我每行一个词。我的程序将它们全部打印到屏幕上,但在每个单词后添加一个新行。我不希望它添加新行或 space。因此,如果 txt 在一行上有 Hello 而在下一行有 Bye,我希望它打印 HelloBye。最终程序的 objective 不会打印字符串,而是将字符串用于其他用途,所以我确实需要一个只有文本而末尾没有 spaces 的字符串或换行。

试试这个。

int main()
{
    FILE *f;
    f = ("words", "r");
    char string[100];
    while (fgets(string, 100, f))
    {
        char * message = strtok(string, "\n");
        printf("%s", message);
    }
}

strtok 将字符串标记为 your message\nfgets 将捕获 \n 令牌

按设计 fgets 读取一行(以 \n 结尾)并在行中保留 \n - 提供缓冲区足够大了。看看最后一个字符是否是 \n,是否将其替换为 [=15=],实际上将行的长度减少了一个:

int main(void)
{
    FILE *f;
    f = ("words", "r");
    char string[100];
    while (fgets(string, 100, f))
    {
         if ((string[0] != '[=10=]') && (string[strlen(string) -1] == `\n')) {
             string[strlen(string) -1] = `[=10=]';
         }
         printf("%s", string);
    }
}

您不能阻止 fgets()'\n' 存储在提供给它的数组的末尾。如果数组太短,fgets()将不会存储换行符,它会将数组中放不下的字符留在输入流中,以供下一次输入操作读取。

有多种方法可以删除尾随换行符,可能存在也可能不存在:

使用strcspn()

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

int main(void) {
    char string[100];
    FILE *f = fopen("words", "r");
    if (f != NULL) {
        while (fgets(string, sizeof string, f)) {
            string[strcspn(string, "\n")] = '[=10=]';
            printf("%s", string);
        }
    }
    return 0;
}

使用strlen()

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

int main(void) {
    char string[100];
    FILE *f = fopen("words", "r");
    if (f != NULL) {
        while (fgets(string, sizeof string, f)) {
            size_t len = strlen(string);
            if (len > 0 && string[len - 1] == '\n')
                string[--len] = '[=11=]';
            printf("%s", string);
        }
    }
    return 0;
}

使用strchr()

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

int main(void) {
    char string[100];
    FILE *f = fopen("words", "r");
    if (f != NULL) {
        while (fgets(string, sizeof string, f)) {
            char *p = strchr(string, "\n");
            if (p != NULL)
                *p = '[=12=]';
            printf("%s", string);
        }
    }
    return 0;
}