fgets()包含字符串

时间:2015-08-08 17:10:28

标签: c fgets

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

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

这段代码不是复制粘贴的,所以我本可以忘记一些小块但是应该可以工作。在words.txt中,每行都有一个单词。我的程序将它们全部打印到屏幕上,但在每个单词后添加一个新行。我不希望它添加新行或空格。因此,如果txt在一行上有Hello而在下一行有Bye,我希望它打印HelloBye。最终程序的目标不是打印字符串,而是将字符串用于其他内容,因此我需要一个字符串,其中只有文本末尾没有空格或新行。

3 个答案:

答案 0 :(得分:1)

按设计 fgets读取一行(以\n结尾)并将\n保留在行中 - 前提是缓冲区足够大。只要查看最后一个字符是\n,它是否用\0替换它,实际上减少了一行的len:

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

答案 1 :(得分:0)

您不能防止 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")] = '\0';
            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] = '\0';
            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 = '\0';
            printf("%s", string);
        }
    }
    return 0;
}

答案 2 :(得分:-1)

试试这个。

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令牌