在C语言中将数据输入到字符指针数组中

3

这是我在这里提问的第一个问题,如果我没有遵循格式规则,请原谅。我正在用C语言编写一个程序,需要从文件中读取几行。我试图将每一行放入一个cstring中。我声明了一个名为buf的二维字符数组,用于存储文件中的5行内容。相关代码如下:

#include <stdlib.h>
#include <sys/types.h>
#include <sys/file.h>
#include <sys/socket.h>
#include <sys/un.h>      /* UNIX domain header */

void FillBuffersForSender();

char buf[5][2000]; //Buffer for 5 frames of output

int main()
{

FillBuffersForSender();

return 0;
}

void FillBuffersForSender(){
    FILE *fp;
    int line = 0;
    char* temp = NULL;
    size_t len = 0;
    ssize_t read;
    fp = fopen("frames.txt", "r");
    printf("At the beginning of Fill Buffers loop.\n");
    //while ((read = getline(&temp, &len, fp)) != -1){
    while(line < 5){
            //fprintf(stderr, "Read in: %s\n", temp);
            fgets(temp, 2000, fp);
            strcpy(buf[line], temp);
            line++;
            fprintf(stderr, "Line contains: %s.\n", temp);
            temp = NULL;
           }
    while(line != 0){
        fprintf(stderr, "Line contains: %s.\n", buf[line]);
        line--;
    }

}

这行代码

strcpy(buf[line], temp);

代码导致分段错误。我已经尝试过多种方法,但似乎一直无法让它工作。虽然我不熟悉C语言,但任务是要在其中编写双向滑动窗口协议。我一直遇到像这样的超基本问题!如果这是C++,我早就完成了。希望有人能提供帮助,感激不尽。

3个回答

3

temp需要指向已分配的缓冲区,以便fgets可以写入其中。


1

在C编程中,错误检查是每个程序的重要部分(事实上有时似乎比功能代码更多的是错误处理代码)。代码应该检查每个函数的返回值以确保它正常工作,例如如果fopen返回NULL,那么它无法打开文件,同样地,如果fgets返回NULL,则它无法读取行。

此外,代码需要在完成后清理自己。例如,当文件指针超出范围时没有关闭文件的析构函数,因此代码需要显式调用fclose关闭文件。

最后,请注意许多C库函数具有需要理解和正确处理的怪癖。您可以通过阅读函数的man页面来了解这些怪癖。例如,fgets函数将在它读取的每一行末尾留下换行符\n。但是文件的最后一行可能没有换行符。因此,在使用fgets时,最好去除换行符。

考虑到所有这些,代码应该如下所示:

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

#define MAXLINE   5
#define MAXLENGTH 2000

static char buffer[MAXLINE][MAXLENGTH];

void FillBufferForSender(void)
{
    char *filename = "frames.txt";
    FILE *fp;
    if ((fp = fopen(filename, "r")) == NULL)
    {
        printf("file '%s' does not exist\n", filename);
        exit(1);
    }

    for (int i = 0; i < MAXLINE; i++)
    {
        // read a line
        if (fgets( buffer[i], MAXLENGTH, fp ) == NULL)
        {
            printf("file does not have %d lines\n", MAXLINE);
            exit(1);
        }

        // strip the newline, if any
        size_t newline = strcspn(buffer[i], "\n");
        buffer[i][newline] = '\0';
    }

    fclose(fp);
}

int main(void)
{
    FillBufferForSender();        
    for (int i = 0; i < MAXLINE; i++)
        printf("%s\n", buffer[i]);
}

注意:关于如何使用strcspn去除换行符的解释,请参见this answer

1

谈到C语言,就必须考虑内存。如果一个指针被赋为NULL,它的内存在哪里?我们如何将某些东西复制到我们没有空间的地方?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接