2014-10-17 74 views
0

我有这两个功能在我的main.c文件,但是当我尝试编译我收到以下错误: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

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

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

之前添加此行您main()函数声明函数:

char* getFileString(char *fileName); 

或者,您可以main()之前移动整个函数定义。 (在技术上,如果它们之间存在循环依赖关系,则只需要预先声明函数,否则就可以对函数进行排序,以便在定义函数之前不使用函数。但是,出于代码组织目的,有时它会使更多感申报您的所有功能,在顶部和后实施。)


作为一个侧面说明,始终以最高警告级别的编译器允许(-Wall海合会)编译。编译器会发出一个警告,说它没有看到getFileString()的声明,并且它产生了一个隐含的声明。

+0

谢谢!我还是一个在c的菜鸟,但它现在完美。 – atg963 2014-10-17 01:44:53

+0

其实我有另一个小问题,以及当字符串打印出来的命令行即时通讯获得一堆奇怪的字符,看起来像盒子中的十六进制数字任何想法这可能是什么? – atg963 2014-10-17 01:50:10

+0

@ atg963通常这意味着你正在尝试将某些东西显示为一个字符串,但它没有被初始化,因此它包含垃圾。 – cdhowie 2014-10-17 22:20:45

相关问题