好吧,我很困惑 . 我使用了一段代码,可以打开并读取文件并将其存储在动态内存中 . 输出在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;
}