我在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;
}
}
答案 0 :(得分:1)
您需要在使用之前声明函数。因为您在声明它之前使用了getFileString()
,所以编译器根据使用的实际参数推断出参数的类型,并隐式地给它返回类型int
。然后,当编译器稍后遇到您的定义时,它会注意到返回类型int
和char *
不匹配,因此错误。
(这也解释了警告main.c:30: warning: assignment makes pointer from integer without a cast
- 你正在分配一个int
,或者编译器决定的是int
,因为你没有告诉它{ {1}}。)
在char *
函数之前添加此行以声明函数:
main()
或者,您可以在char* getFileString(char *fileName);
之前移动整个函数定义。
(从技术上讲,只有在它们之间存在循环依赖关系时才需要预先声明函数,否则你可以只定义函数,以便在定义函数之前不使用函数。但是,出于代码组织的目的,有时它更有意义在顶部声明所有函数并在以后实现它们。)
作为旁注,请始终使用编译器允许的最大警告级别进行编译(gcc上为main()
)。编译器会发出警告,表示它没有看到-Wall
的声明,并且它正在生成一个隐含声明。