【问题标题】:Data entry into array of character pointers in C将数据输入到C中的字符指针数组中
【发布时间】:2014-12-05 01:20:29
【问题描述】:

这是我在这里提出的第一个问题,所以如果我没有遵循此处的格式规则,请原谅我。我正在用 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++ 中,我已经完成了。任何人都能提供的任何帮助都是不可思议的。谢谢你。

【问题讨论】:

    标签: c arrays file-io char


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      最后,请注意,许多 C 库函数都有需要理解和正确处理的怪癖。您可以通过阅读函数的手册页来了解这些怪癖。例如,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

      【讨论】:

        【解决方案3】:

        说到C,你必须考虑记忆。分配了 NULL 的点的内存在哪里?我们如何将某些内容复制到我们没有空间的地方?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-01-12
          • 1970-01-01
          • 2021-06-28
          • 2012-10-05
          • 1970-01-01
          • 2012-12-10
          • 1970-01-01
          • 2021-01-18
          相关资源
          最近更新 更多