以下代码旨在获取网址路径并将其转换为小写。它完成了这项工作,但它也在小写路径名之后吐出(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;
}
答案 0 :(得分:2)
需要在编译时定义数组大小(在本例中为char
数组)。您正试图在lookup()
函数中在运行时定义它。
有两种解决方法:
使用char
指针和malloc()
代替固定数组:
char* temp = malloc (sizeof(path) + 1);
使用固定大小(例如char temp[100]
)声明您的数组,但请记住,您的输入字符串(空终止的+1)不能超过此长度。
使用第一个选项的完整解决方案,包括其他海报指出的修正,以及删除一些冗余,将如下所示:
#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}。您希望它返回指向堆分配指针的指针(可能使用malloc
或strdup
),然后您需要有关free
该区域的约定。您可以记录(在某些注释中)lookup
正在返回堆分配的指针,并且调用者通常负责free
-
详细了解C dynamic memory allocation。
不要忘记使用所有警告编译代码&amp;调试信息(例如gcc -Wall -g
)。 使用调试器(gdb
)&amp; valgrind