我目前正在编写一个解析流中输入的测试程序。我不会详细介绍这个程序,但我目前正在尝试解析字母数字字符,然后将它们分配给临时字符串 temp [100] 。将所有有效字符分配给 temp 后,我将内存和 strncpy 分配给已分配的字符串变量。
Valgrind抱怨我使用 strlen 的两个用法,并且我单独使用 strncpy 。为什么是这样?它抱怨未初始化的值,但我明确表示除非 temp 中有字符,否则不会进行任何分配。有什么建议吗?
char *name(char a)
{
int x;
char c;
char *returnName = 0;
char temp[100];
int i = 0;
/* Ensures no character is skipped */
temp[i] = a;
i++;
/* Fill temp one character at a time */
while((x = getchar()) != EOF)
{
c = (char)x;
/* Valid characters are assigned */
if((isalnum(c)) || c == '_')
{
temp[i] = c;
i++;
}
/* As soon as invalid character appears, exit loop */
else
break;
}
/* Make sure temp is not NULL before mallocing */
if(temp[0] != '\0') /* Thank you Alter Mann for this fix */
{
printf("Before malloc\n");
returnName = malloc(sizeof(char)*strlen(temp)+1);
printf("After malloc before strncpy\n");
strncpy(returnName, temp, strlen(temp)+1);
printf("After strncpy before return\n");
return returnName;
}
/* If nothing is assigned, return NULL */
return NULL;
}
答案 0 :(得分:1)
下面:
if(temp != NULL)
您需要检查
if(temp[0] != '\0')
temp
是一个数组,而不是指针。
并且(正如Paul Griffiths指出的那样),在while
循环之后终止你的字符串:
temp[i] = '\0';
答案 1 :(得分:1)
您永远不会在temp
中空终止字符串,因此strlen()
和strcpy()
都会读取数组中的初始化值,因此Valgrind会给您带来未初始化的值错误。
变化:
char temp[100];
为:
char temp[100] = {0};
你应该好。