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