gpt4 book ai didi

C 基本字符串返回函数

转载 作者:太空宇宙 更新时间:2023-11-04 00:11:30 25 4
gpt4 key购买 nike

我对 C 还是很陌生。我仍然完全不了解指针的所有内容。我正在尝试制作一个返回字符串的方法。这是函数,它仍然不完整。

char getS(char *fileName){
FILE *src;
if((src = fopen(fileName, "r")) == NULL){
printf("%s %s %s", "Cannot open file ", fileName, ". The program is now ending.");
exit(-1);
}
char *get = " ";
//insert getting a random word here
return(*get);
}

我正在尝试这样调用方法

char *article = getS("articles.txt");
char *noun = getS("nouns.txt");
char *verb = getS("verbs.txt");

编译器给我这个:

error: invalid type argument of unary ‘*’ (have ‘int’)

我该怎么办?

最佳答案

以下信息可能比您正在寻找的要多得多。现在不要太担心吸收它,但你以后可能需要它。

首先,关于术语的重要说明。 C 没有“字符串”类型。引用 ISO C 标准:

A string is a contiguous sequence of characters terminated by and including the first null character. [...] A pointer to a string is a pointer to its initial (lowest addressed) character.

特别是 char* value 是一个指针,不是一个字符串(尽管我们通常使用 char* 指针来访问和操作字符串)。即使数组本身也不是字符串,但它可以包含一个字符串。

对于您的(相对简单的)函数,char*您要返回的值指向字符串文字(的第一个字符),因此内存管理不是问题。对于更复杂的情况,语言坦率地说并不是特别有用,您必须自己做一些工作来管理内存。

函数可以很容易地返回 char*指向一个字符串的值,允许调用者对该字符串执行它喜欢的操作——但是组成该字符串的字符存储在哪里?

有(至少)三种常用方法。

(1) 该函数返回一个指向char静态 数组开头的指针:

char *func(void) {
static char result[100];
// copy data into result
return result;
}

这是有效的,但它有一些缺点。 result 只有一个副本数组,并连续调用 func()将破坏该数组的内容。并且数组有固定的大小;它必须足够大以容纳它可以返回的最大字符串。标准C asctime()函数以这种方式工作。

(2) 调用者可以传入一个字符串指针,让函数填充:

void func(char *buffer) {
// code to copy data into the array pointed to by buffer
}

这给调用者带来了负担,调用者必须分配一个 char 的数组。 ,尤其是必须知道它需要多大。

(3) 该函数可以使用malloc() 为字符串分配内存。 :

char *func(void) {
char *result = malloc(some_number);
if (result == NULL) {
// allocation failed, cope with the error
}
// copy data into the array pointed to by result
return result;
}

这样做的好处是函数可以决定它需要分配多少内存。但是调用者必须知道字符串是在堆上分配的,所以它可以稍后通过调用 free() 来释放它。 . malloc()free()函数也可能相对昂贵(但不要担心,除非您确定程序的性能不够好)。

其实还有第四种方法,但是错误:

char *bad_func(void) {
char result[100];
// copy data into result
return result; // equivalent to "return &result[0];"
}

这里的问题是 result是函数的局部变量,未定义为 static ,所以一旦函数返回,数组对象就不复存在了。调用者将收到一个指向不再保留的内存的指针,并且可以在您的背后重新使用。您可以返回指向本地 static 的指针对象(因为单个副本在程序的生命周期内存在),并且您可以返回本地非 static对象,但您不能安全地返回本地非 static地址对象。

comp.lang.c FAQ是一个很好的资源。

关于C 基本字符串返回函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12575123/

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