我正在尝试将字符串转换为矢量。我的代码是:
char **my_str2vect(char *str)
{
char** vect;
char* temp;
int num_whitespaces = 0;
temp = str;
for(; *temp!= '\0'; temp++)
{
if(*temp == ' ')
{
num_whitespaces++;
}
}
vect = (char **)malloc((num_whitespaces+1)*sizeof(char *));
*vect = str;
for(; *str != '\0'; str++)
{
if(*str == ' ')
{
*str = '\0';
*vect = ++str;
vect++;
}
}
*vect = NULL;
return vect;
}
不幸的是我遇到了分段错误。我使用以下代码调用该函数:
n = read(0, buffer, MAX-1);
buffer[MAX] = '\0';
if(n >= 0)
{
vect = my_str2vect(buffer);
}
答案 0 :(得分:0)
您只分配矢量,但不分配矢量的每种情况。您可以使用calloc
。
答案 1 :(得分:0)
您的代码中有几个错误:
1.在my_str2vect
函数中,指针vect
移动到已分配内存的末尾,因此当您返回vect并希望使用vect[1]
或vect[2]
时在调用函数中,必须存在段错误。在vect_tmp
开始操作之前,您可以使用vect
存储原始位置。
2.开始转换字符串时出现一些逻辑错误。请参阅下面的修改后的代码。
char **my_str2vect(char *str)
{
char** vect;
char** vect_tmp;
char* temp;
int num_whitespaces = 0;
temp = str;
for(; *temp!= '\0'; temp++)
{
if(*temp == ' ')
{
num_whitespaces++;
}
}
vect_tmp = (char **)malloc((num_whitespaces+1)*sizeof(char *));
vect = vect_tmp;
*vect = str;
for(; *str != '\0'; str++)
{
if(*str == ' ')
{
*str = '\0';
*(++vect) = str + 1;
}
}
*(++vect) = NULL;
return vect_tmp;
}
请注意,即使修改后,此功能仍然无法处理连续空格的某些特殊情况。您可能会花更多时间来提高兼容性。