gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:28:53 25 4
gpt4 key购买 nike

我的 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;
}
}

最佳答案

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

(这也解释了警告main.c:30:警告:赋值使指针来自整数而不进行强制转换——您正在分配一个int,或者什么编译器决定是一个 int 因为你没有告诉它另外一个 char *。)

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

char* getFileString(char *fileName);

或者,您可以将整个函数定义移到 main() 之前。

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

<小时/>

顺便说一句,请始终使用编译器允许的最大警告级别进行编译(gcc 上的 -Wall)。编译器会发出警告,指出它没有看到 getFileString() 的声明,并且正在生成一个隐式声明。

关于c 字符串返回类型不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26416612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com