函数有效,但也返回null - C.

时间:2016-12-06 05:59:01

标签: c arrays string

以下代码旨在获取网址路径并将其转换为小写。它完成了这项工作,但它也在小写路径名之后吐出(null)。根据我的阅读,这与我的temp数组需要一个空终止符有关。我为它腾出了空间并尝试分配它,但我收到以下错误variable-sized object may not be initialized。我还不完全确定如何解决这个问题,因为我还没有在char *和数组符号之间进行完全的舒适切换。如果有人能指出我正确的方向,我将非常感激!

    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <strings.h>
    #include <string.h>

    const char* lookup(const char* path);

    int main (void)
    {
        const char* test = lookup("http://WWW.google.COM");

        printf("%s", test);

        return 0;
    }

    const char* lookup(const char* path)
    {
        // this is where I tried to add the null terminator
        char temp[strlen(path) + 1];

        strcpy(temp, path);

        for (int i = 0, n = strlen(path); i < n; i++)
        {
            if (isalpha(temp[i]))
            {
                if (isupper(temp[i]))
                {
                    temp[i] = tolower(temp[i]);
                }
            }
        }
        printf("%s", temp);
        printf("\n");

        return 0;
    }

2 个答案:

答案 0 :(得分:2)

需要在编译时定义数组大小(在本例中为char数组)。您正试图在lookup()函数中在运行时定义它。

有两种解决方法:

  • 使用char指针和malloc()代替固定数组:

    char* temp = malloc (sizeof(path) + 1);
    
  • 使用固定大小(例如char temp[100])声明您的数组,但请记住,您的输入字符串(空终止的+1)不能超过此长度。

    < / LI>

使用第一个选项的完整解决方案,包括其他海报指出的修正,以及删除一些冗余,将如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <strings.h>
#include <string.h>

const char* lookup(const char* path);

int main (void)
{
    const char* test = lookup("http://WWW.google.COM");

    printf("%s", test);
    printf("\n");

    free((void*)test);

    return 0;
}

const char* lookup(const char* path)
{
    // this is where I tried to add the null terminator
    char* temp = malloc (strlen(path) + 1);
    strcpy(temp, path);

    for (int i = 0, n = strlen(path); i < n; i++)
    {
        if (isupper(temp[i]))
        {
            temp[i] = tolower(temp[i]);
        }
    }       

    return temp;
}

答案 1 :(得分:1)

您的lookup函数始终返回0(为了便于阅读,return 0;应写入return NULL;。顺便说一句,它无法返回本地数组(也就是说,代码中的return temp;将是undefined behavior}。您希望它返回指向堆分配指针的指针(可能使用mallocstrdup),然后您需要有关free该区域的约定。您可以记录(在某些注释中)lookup正在返回堆分配的指针,并且调用者通常负责free -

详细了解C dynamic memory allocation

不要忘记使用所有警告编译代码&amp;调试信息(例如gcc -Wall -g)。 使用调试器gdb)&amp; valgrind