首页 > 解决方案 > 为什么这个函数返回null?

问题描述

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

例如

给定函数的输入" 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;
    }

标签: c

解决方案


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

  1. 你想要一个 1000 个字符的块,而不是指针。
  2. 实际上,1000 不是您想要的字符数。您通常需要较小的数字,但也可能需要较大的数字。
  3. 您不想将结果存储在自动分配的内存中,因为一旦您退出该函数,它就会被释放。使用(或类似的malloc东西)。mallocstrdup

使固定:

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

推荐阅读