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

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日

悬赏问题

  • ¥50 使用CUDA如何高效的做并行化处理,是否可以多个分段同时进行匹配计算处理?目前数据传输速度有些慢,如何提高速度,使用gdrcopy是否可行?请给出具体意见。
  • ¥15 基于STM32,电机驱动模块为L298N,四路运放电磁传感器,三轮智能小车电磁组电磁循迹(两个电机,一个万向轮),如何通过环岛的原理及完整代码
  • ¥20 机器学习或深度学习问题?困扰了我一个世纪,晚来天欲雪,能饮一杯无?
  • ¥15 c语言数据结构高铁订票系统
  • ¥15 关于wkernell.PDB加载的问题,如何解决?(语言-c#|开发工具-vscode)
  • ¥15 (标签-STM32|关键词-智能小车)
  • ¥20 关于#stm32#的问题,请各位专家解答!
  • ¥15 (标签-python)
  • ¥20 搭建awx,试了很多版本都有错
  • ¥15 java corba的客户端该如何指定使用本地某个固定IP去连接服务端?