C 为什么这个函数返回null?
此代码查找字符串中的下一个单词 例如 如果输入C 为什么这个函数返回null?,c,C,此代码查找字符串中的下一个单词 例如 如果输入“我的蛋糕”,函数应返回“我的蛋糕”。作为预期产出 如果我使用return则输出为(null),但我使用printf则代码工作 我想知道如何使用return获得预期的输出 #include <stdio.h> int main() { char* str[1000]; printf("enter:"); fgets(str,1000,stdin
“我的蛋糕”
,函数应返回“我的蛋糕”
。作为预期产出
如果我使用return
则输出为(null),但我使用printf
则代码工作
我想知道如何使用return获得预期的输出
#include <stdio.h>
int main()
{
char* str[1000];
printf("enter:");
fgets(str,1000,stdin);
printf("%s",find_word_start(str));
}
char* find_word_start(char* str){
char* result[1000];
int c = 0, d = 0;
while(str[c] ==' ') {
c++;
}
while(str[c] != '\0'){
result[d++] = str[c++];
if(str[c]==' ') {
result[d++] = str[c++];
}
while(str[c]==' ') { //
c++;
}
}
result[d] = '\0';
//print or return char?
return result;
}
#包括
int main()
{
char*str[1000];
printf(“输入:”);
fgets(str,1000,stdin);
printf(“%s”,find_word_start(str));
}
char*find\u word\u start(char*str){
字符*结果[1000];
int c=0,d=0;
而(str[c]=''){
C++;
}
而(str[c]!='\0'{
结果[d++]=str[c++];
如果(str[c]=''){
结果[d++]=str[c++];
}
而(str[c]=''{//
C++;
}
}
结果[d]='\0';
//打印还是返回字符?
返回结果;
}
下一行在堆栈中分配内存空间,但函数结束后,所有内容都消失了:
char result[1000];
您需要像这样在堆中分配内存:
char *result = malloc(sizeof(char) *1000);
注意:不要忘记使用
free
函数释放内存空间。char*result[1000]代码>创建一个包含1000个指针的数组。这在很多方面都是错误的
您需要的是1000个字符的块,而不是指针
实际上,1000不是您想要的字符数。你通常想要一个较小的数字,但你也可以想要一个较大的数字
您不希望将结果存储在自动分配的内存中,因为一旦退出函数,就会释放该内存。使用malloc
(或执行malloc
的操作,例如strdup
)
修正:
我和你一样避免使用上面的字符串函数,但它们大大简化了解决方案
// Returns a copy that needs to be freed.
char* find_word_start(const char* src) {
while (*src == ' ')
++src;
return strdup(src);
}
也就是说,由于您返回字符串的末尾,因此只需将指针返回到现有字符串中即可
// Returns a pointer into the provided string.
const char* find_word_start(const char* str) {
while (*str == ' ')
++str;
return str;
}
您的意思可能是char result[1000]
而不是char*result[1000]
?另外-result
是堆栈上定义的自动变量。从子程序返回它是一个典型的错误。建议:将result
定义为char*
,动态为其分配内存,并返回该值。调用者负责清理分配的内存。您将返回指向堆栈值的指针。这甚至可以编译吗?@geckos:这在很大程度上取决于所使用的操作系统、编译器和编译器选项。@BobJarvis我尝试了char result[1000]
,但仍然返回null,我不知道如何动态分配内存,我不熟悉c语言。我尝试了char*结果
而不是char*result[1000]
,它可以工作,即使我不明白为什么。result
是一个自动存储持续时间数组,因此当函数返回时,就程序而言不再存在。将其用作返回值,并在调用者中使用该返回值,会导致未定义的行为。多余的强制转换和sizeof(char)
保证是1
。但更重要的是,1000
是错误的。@ikegami:1000只是一个例子。这无关紧要;没有其他号码是可以的,尽管我已经解释了这三个错误,包括一个错误的硬编码号码,
// Returns a pointer into the provided string.
const char* find_word_start(const char* str) {
while (*str == ' ')
++str;
return str;
}