c程序正在编译和运行,但我在终端得到一个奇怪的输出
所以我有一个方法,在c中把一个字符串从一个文件移动到一个字符数组,但是当我试图打印出来时,我在终端中得到一个奇怪的输出,它看起来像是每个字符点的一个字符串串,每个框有4个0和1 以下是我的代码:c程序正在编译和运行,但我在终端得到一个奇怪的输出,c,string,output,C,String,Output,所以我有一个方法,在c中把一个字符串从一个文件移动到一个字符数组,但是当我试图打印出来时,我在终端中得到一个奇怪的输出,它看起来像是每个字符点的一个字符串串,每个框有4个0和1 以下是我的代码: int main(int argc, char** argv){ if(argc != 3){ printf("not valid # of arguments"); return 1;
int main(int argc, char** argv){
if(argc != 3){
printf("not valid # of arguments");
return 1;
}
struct stat info;
int status;
status = stat(argv[2], &info);
if(status != 0){
printf("Error, errno = %d\n", errno);
return 1;
}
//command line argument is file
if(S_ISREG (info.st_mode)){
printf("%s is a file \n", argv[2]);
char *string1;
string1 = getFileString(argv[2]);
printf("string in file is %s \n", string1);
free(string1);
return 0;
}
if(S_ISDIR(info.st_mode)){
printf("%s is a directory \n", argv[2]);
openDirRec(argv[2]);
//what to do if command line argument is directory
}
return 0;
}
char* getFileString(char *fileName){
FILE* qp;
qp = fopen(fileName, "r");
char ch;
struct stat st;
if(stat(fileName, &st) != 0) {
return NULL;
}
/*int sizeCheck = 0;
while((ch=fgetc(qp))!=EOF){
sizeCheck++;
}
*/
int sizeCheck = st.st_size;
if(sizeCheck == 0){
return NULL;
}
else{
//fseek(qp, SEEK_SET, 0);
char *fileString;
fileString = (char*)malloc(sizeof(char) * sizeCheck + 1);
memset(fileString, 0, sizeCheck + 1);
//rewind(qp);
int count = 0;
while((ch=fgetc(qp)!=EOF)){
fileString[count] = ch;
count++;
}
printf("%s\n", fileString);
fileString[sizeCheck] = '\0';
fclose(qp);
return fileString;
}
}
这条线就是罪魁祸首
while((ch=fgetc(qp)!=EOF))
由于运算符优先级,这相当于:
while(ch = (fgetc(qp)!=EOF) )
你需要的是对妄想症的重新整理
while((ch=fgetc(qp)) != EOF)
sizeof(char)
定义为1
;乘以它毫无意义。另外,始终检查malloc
的结果是否为NULL
。而且,stat
已经告诉您文件的大小;您的sizeCheck++
循环效率非常低,没有必要。另外,查看fread;为每个字符调用fgetc
,效率也很低。此外,您可能需要在打印字符串之前终止字符串。另外,您确定您的文件仅包含ASCII字符吗?另外,现在是学习如何使用调试器的最佳时机。这会导致关闭一个,fileString[sizeCheck+1]='\0'@JonathonReinhart是的,我正在使用gdb,当我在修改代码之前检查gdb时,第一个用ch计数的循环实际上读取了字符,我去掉了它,使用了stat结构,这样得到了大小,但是循环中用于将字符放入数组的所有字符都显示为“\001”,并且它仍然输出相同的内容。你是对的,它现在工作得很好!真不敢相信我花了好几个小时在这上面因为那太谢谢你了!