好吧,我很困惑 . 我使用了一段代码,可以打开并读取文件并将其存储在动态内存中 . 输出在void函数中执行,其中文件是逐行给出的 . 指定了缓冲区字符数组的大小,因为每行包含的字节数未知 . 我想比较读取的字符串与用户输入(由char * word给出)以查看程序是否有效 .

在我看来,如果字符串的大小和字符序列相同,则字符串只能是相同的,并且动态字符串大小与文件的字符串大小不同 . 通过在main()循环(即pos)中使用计数器,我可以确定从文件中读取的字符串的正确大小,并将其传递给void函数 . 在void handle_line函数中,我将缓冲区中的字符复制到char * temp中,因为我知道temp需要的字符数(即pos),因此可以初始化其大小并将动态内存的内容复制到char * temp中 . 我继续打印出line,temp和word的字符串大小的字节 . 虽然char * temp和char * word给出了它们的期望值,但char * line总是四个字节 . 此外,当从CompoundLib文件中读取H2O时,strcmp()没有给出预期的结果 - 尽管事实上我知道它们的大小和字符序列是相同的 . 怎么会这样?我错过了什么?提前谢谢了 .

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

void handle_line(char *line, int a) {
   char temp[a];
   int i=0;
   char temp_2[a];
   char *word="H2O";
   for(i=0;i<=a;i++)
       temp[i]=line[i];
   temp_2[i]=temp[i];
   printf("size of temp= %d\n",sizeof temp_2);
   printf("size of word= %d\n",sizeof word);
   printf("size of line= %d\n",sizeof line);
   if (strcmp(temp_2, word) == 0)
       puts("Strings equal");
   else
       puts("Strings do not equal");

   printf("%s\n", line);
   printf("%d\n", a);
   printf("%s\n",temp);

 }

int main(int argc, char *argv[]){
    char c[1000];
    FILE *fptr;

    int size = 1024, pos;
    int c;
    char *buffer = (char *)malloc(size);

    FILE *f = fopen("CompoundLib.txt", "r");
    if(f) {
        do { // read all lines in file
            pos = 0;
            do{ // read one line
               c = fgetc(f);


               if(c != EOF) buffer[pos++] = (char)c;
               if(pos >= size - 1) { // increase buffer length - leave room for 0
                    size *=2; //size = size*2

                }
            }while(c != EOF && c != '\n');

            buffer[pos] = 0;

            handle_line(buffer, pos);

        } while(c != EOF);
        fclose(f);
    }

    free(buffer);

    return 0;
}