kassc 2021-10-12 10:45 采纳率: 100%
浏览 494
已结题

c语言初级代码,两段完全一样的代码,输出却不一样,咋回事啊?

两段几乎一样的代码,输出却不一样。
功能:一个 char类型的指针从文件中读了两行字符串,"aa bb cc \n dd ee\n";然后将其中的每个字符串都存到一个指针数组中,例如:读到aa存到数组中第一个指针元素,以此类推。

int main(){
   FILE *fp = fopen("test.txt", "r");
   if(fp == NULL){
      perror("file open");
      exit(-1);
   }
   fseek(fp, 0L, 2);
   int fileSize = ftell(fp);
   char *data = (char *)malloc(fileSize*sizeof(char));
   rewind(fp);
   fread(data, sizeof(char), fileSize, fp);
   int i;
   int space = 0;
   int n = 0;
   for(i = 0; i < strlen(data); i++){
      if(data[i] == ' '){
         space++;
      }
      if(data[i] == '\n'){
         n++;
      }
   }
   int NUM_STR = space + n;
   printf("total=%d\n", NUM_STR);
   char *arr[NUM_STR];
   int j=0;
   char temp[8];
   int count = 0;
   printf("%s", data);
   for(i = 0; i < strlen(data); i++){
      temp[count] = data[i];
      count++;
      if(data[i+1] == ' ' || data[i+1] == '\n'){
         arr[j] = (char *)malloc(sizeof(char)*count);
         strcpy(arr[j],temp);
         printf("%s", temp);
         count=0;
         i++;
         j++;
      }
   }

   printf("strlen=%d\n",strlen(arr[0]));

上面这段在main函数中的代码可以正常输出,结果也是对的,最后一行打印的数组中第一个元素的strlen也是2,问题出现在下面相同的代码中

void readFromFile(char *file){
   FILE *fp = fopen(file, "r");
   if(fp == NULL){
      perror("file open");
      exit(-1);
   }
   fseek(fp, 0L, 2);
   int fileSize = ftell(fp);
   char *data = (char *)malloc(fileSize*sizeof(char));
   rewind(fp);
   fread(data, sizeof(char), fileSize, fp);
   int i;
   int space = 0;
   int n = 0;
   for(i = 0; i < strlen(data); i++){
      if(data[i] == ' '){
         space++;
      }
      if(data[i] == '\n'){
         n++;
      }
   }
   int NUM_STR = space + n;
   printf("total=%d\n", NUM_STR);
   char *arr[NUM_STR];
   int j=0;
   char temp[2];
   int count = 0;
   printf("%s", data);
   for(i = 0; i < strlen(data); i++){
      temp[count] = data[i];
      count++;
      if(data[i+1] == ' ' || data[i+1] == '\n'){
         printf("%s\n", temp);
         arr[j] = (char *)malloc(sizeof(char)*count);
         strcpy(arr[j],temp);
         printf("count=%d\n",count);
         count=0;
         i++;
         j++;
      }
   }
   printf("strlen=%d\n",strlen(arr[0]));

这里只是在函数中做相同的事情,代码几乎都是copy过去的,但是结果不一样,最后一行strlen的长度居然是6. 麻烦大家帮我看看问题出现在哪,谢谢了

  • 写回答

3条回答 默认 最新

  • qfl_sdu 2021-10-12 10:52
    关注

    字符串没有正确的结束
    第二段代码35行:
    在arr[j] = (char *)malloc(sizeof(char)*count);这句话下面加一句:
    memset(arr[j],0,count);
    另外,第36行,在strcpy(arr[j],temp);的时候,最多只能复制2个,因为temp只有2个字节的大小
    在strcpy(arr[j],temp);下面加一句
    if(count >2) arr[j][2] = 0;

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 10月21日
  • 已采纳回答 10月13日
  • 赞助了问题酬金 10月12日
  • 创建了问题 10月12日

悬赏问题

  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python