0

我有一个从 txt 文件读取的 C 程序。文本文件包含一个单词列表,每行一个单词。我想要做的是从文本文件中获取单词并将它们打印为一个句子/段落,但是,当我尝试打印它们时,它们仍然每行打印一个单词。当我从文件中读取它们时,我将它们存储在 2d 字符数组中。我认为正在发生的是数组从 txt 文件中复制换行符,对吗?如果是这样,如何在没有新行字符的情况下将单词添加到数组中?

    while(fgets(line,20,lineRead)!=NULL)
    {
        for(j = 0; j < 20;j++)
        {            
            message[k][j]= line[j];

        }
        printf("%s", message[k]);
    }

我尝试了几个while循环但没有成功:

while(line[j] != ' ')        
while(line[j] != NULL)       
while(line[j] != EOF)      
while(line[j] != ' \')

我正在学习 C,所以请具体说明我的错误。我想了解我做错了什么,而不仅仅是得到答案。

谢谢!

4

4 回答 4

1

fgets 函数在您正在读取的缓冲区中包含换行符 \n 。只需在循环中包含一个条件语句即可复制除 \n 和 \r 之外的所有字符。就像是:

if ( line[j] != '\n' && line[j] != '\r' ) {
    /* Copy the character in your new buffer */
}
于 2012-10-08T22:10:57.513 回答
1

换行符是字符串的一部分,您需要删除它们:

#include <string.h>

while(fgets(line,20,lineRead)!=NULL)
{
    char* newline_pos = strpbrk (line, "\n\r"); // get first occurance of newline or carriage return
    if (newline_pos) 
         *newline_pos = '\0';

    printf("%s ", line);
}
于 2012-10-08T22:13:17.227 回答
1

您可以简单地将您的 for 循环更改为:

for(j = 0; j < 20 && line[j] != '\n';j++)
{            
    message[k][j]= line[j];
}
if(j < 20)
    message[k][j] = '\0';
于 2012-10-08T22:13:41.250 回答
0

你应该做:

while(fgets(line,20,lineRead)!=NULL)
    {        
        strcpy(message[k], line);
        if(message[k][strlen(line)-1] == '\n')
            message[k][strlen(line)-1] = '\0']
        printf("%s", message[k]);
    }

这样做是它复制linemessage[k]最后一个字符,然后如果它是换行符则删除它。我们正在检查最后一个字符,因为文档说“换行符使 fgets 停止读取,但函数认为它是有效字符并包含在复制到 str 的字符串中。” 因此,如果存在换行符,它将是最后一个字符。

于 2012-10-08T22:13:57.060 回答