我在Mac OS X上编写了一个小程序但是我在以下函数中遇到以下错误:
程序收到信号EXC_BAD_ACCESS,无法访问内存。 原因:KERN_INVALID_ADDRESS位于地址:0x0000000000000000 strstr()
中的0x00007fff99b359c4
/*
* attrvalue(): parse an attribute value pair.
*
* takes a string of the form "ATTRIBUTE = VALUE" and returns the atrribute name
* and value as seperate strings
*
*/
int
attrvalue(char *entry, char **attr, char **value)
{
char *copy;
char *p;
if (!entry || *entry == '\0')
return 1;
copy = strdup(entry);
*attr = strtok(copy, "=");
*value = strtok(NULL, "\n");
/* strip training whitespace from attr and value */
p = strstr(*attr, " ");
if(p)
*p = '\0';
p = strstr(*value, " ");
if(p)
*p = '\0';
return (0);
}
知道这个函数有什么问题吗?
感谢。
答案 0 :(得分:0)
修订回答: 如果你假设在attr或value的开头没有空格(即,行的开头和attr字符串之间没有空格,或者是等号和值字符串),那么你的程序就可以了只需稍微调整即可:将第二个参数中的多个空格更改为strstr()到单个空格。修改后的代码用main()来演示如下。如果你想剥离非尾随空格,那么,当你扩展问题或从我原来答案中的链接借用时,很可能会回到调试器。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/*
* attrvalue(): parse an attribute value pair.
*
* takes a string of the form "ATTRIBUTE = VALUE" and returns the atrribute name
* and value as seperate strings
*
*/
int
attrvalue(char *entry, char **attr, char **value)
{
char *copy;
char *p;
if (!entry || *entry == '\0')
return 1;
copy = strdup(entry);
*attr = strtok(copy, "=");
*value = strtok(NULL, "\n");
/* strip trailing whitespace from attr and value */
p = strstr(*attr, " ");
if(p)
*p = '\0';
p = strstr(*value, " ");
if(p)
*p = '\0';
return (0);
}
int main()
{
char *input = "asdf =blah "; // this works
//char *input = " asdf = blah"; // this would not
char *attr;
char *value;
attrvalue(input, &attr, &value);
printf("attr =\"%s\"", attr);
printf("value=\"%s\"", value);
return 0;
}
原始答案: 我会使用另一种剥离空格的方法,因为它甚至不清楚strstr()在这种情况下如何工作。这是strstr() documentation,这里是SO topic discussing the removal of whitespace in C。
结合其他想法:
if(p)
应为if(p != NULL)
,作为尼特。