c字符串返回类型不正确?

时间:2014-10-17 01:40:36

标签: c string return

我在main.c文件中有这两个函数,但是当我尝试编译时遇到以下错误:

main.c: In function ‘main’:
main.c:30: warning: assignment makes pointer from integer without a cast
main.c: At top level:
main.c:51: error: conflicting types for ‘getFileString’
main.c:30: note: previous implicit declaration of ‘getFileString’ was here

我不明白为什么我不能将指针返回到我在getFileString方法中创建的字符串。我真的需要一个探索。

我真的很遗憾为什么会发生这种情况,我们将非常感谢任何帮助!

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <unistd.h>
#include <errno.h>
#include <limits.h>
#include "tokenizer.h"

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", 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;
        /*
           DIR* directory;
           struct dirent* a; 

        //file to write results to 
        FILE *newFile = fopen("results.txt", "w+");
        */

}

char* getFileString(char *fileName){
        FILE* qp;
        qp = fopen(fileName, "r");
        char ch;
        int sizeCheck = 0;
        while((ch=fgetc(qp))!=EOF){
                sizeCheck++;
        }
        fclose(qp);
        if(sizeCheck == 0){
                return NULL;
        }
        else{
                char *fileString;
                fileString = malloc(sizeof(char) * sizeCheck + 1);

                FILE *cp;
                cp = fopen(fileName, "r");
                char cj;
                int count = 0;
                while((cj=fgetc(cp)!=EOF)){
                        fileString[count] = cj;
                        count++;
                }
                fileString[sizeCheck + 1] = '\0';
                return fileString;
        }
}

1 个答案:

答案 0 :(得分:1)

您需要在使用之前声明函数。因为您在声明它之前使用了getFileString(),所以编译器根据使用的实际参数推断出参数的类型,并隐式地给它返回类型int。然后,当编译器稍后遇到您的定义时,它会注意到返回类型intchar *不匹配,因此错误。

(这也解释了警告main.c:30: warning: assignment makes pointer from integer without a cast - 你正在分配一个int,或者编译器决定的是int,因为你没有告诉它{ {1}}。)

char *函数之前添加此行以声明函数:

main()

或者,您可以在char* getFileString(char *fileName); 之前移动整个函数定义。

(从技术上讲,只有在它们之间存在循环依赖关系时才需要预先声明函数,否则你可以只定义函数,以便在定义函数之前不使用函数。但是,出于代码组织的目的,有时它更有意义在顶部声明所有函数并在以后实现它们。)


作为旁注,请始终使用编译器允许的最大警告级别进行编译(gcc上为main())。编译器会发出警告,表示它没有看到-Wall的声明,并且它正在生成一个隐含声明。