为什么此函数返回null?

时间:2019-09-15 01:26:48

标签: c

此代码查找字符串中的下一个单词。

例如

在输入" my cake"的情况下,该函数应返回"my cake"。作为预期的输出

如果我使用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;
    }

2 个答案:

答案 0 :(得分:2)

char* result[1000];创建一个包含1000个指针的数组。在许多方面都是错误的。

  1. 您需要一个1000个字符的块,而不是指针。
  2. 实际上,1000不是您想要的字符数。通常,您想要一个较小的数字,但是您也可能想要一个较大的数字。
  3. 您不希望将结果存储在自动分配的内存中,因为一旦退出函数,该内存将被释放。使用malloc(或执行malloc的事物,例如strdup)。

修复:

// Returns a copy that needs to be freed.
char* find_word_start(const char* src) {
   while (*src == ' ')
      ++src;

   size_t len = 0;
   while (str[len] != '\0')
      ++len;

   ++len;  // Include NUL
   result = malloc(len);

   char* dst = result;
   while (len--)
      *(dst++) = *(src++);

   return result;
}

好吧,我避免像上面那样使用字符串函数,但是它们大大简化了解决方案。

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

答案 1 :(得分:1)

以下行在堆栈中分配内存空间,但是在函数结束后,所有内容都消失了:

char result[1000];

您需要像这样在堆中分配内存:

char *result = malloc(sizeof(char) *1000);

注意:不要忘记通过free函数释放该内存空间。