kassc
2021-10-12 10:45
采纳率: 100%
浏览 439

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条)

相关推荐 更多相似问题