c程序正在编译和运行,但我在终端得到一个奇怪的输出

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;

所以我有一个方法,在c中把一个字符串从一个文件移动到一个字符数组,但是当我试图打印出来时,我在终端中得到一个奇怪的输出,它看起来像是每个字符点的一个字符串串,每个框有4个0和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”,并且它仍然输出相同的内容。你是对的,它现在工作得很好!真不敢相信我花了好几个小时在这上面因为那太谢谢你了!