简介
我试图遍历缓冲区并将其内容复制到指针数组中。最终目标是将每个单词拆分为自己的缓冲区。这是代码。 (它不完整,只是一个片段。)
代码
char *buf = "install-pkg argument1";
char *first_phrase;
for(int i=0; i<strlen(buf); i++)
{
if(buf[i] != " ")
first_phrase += buf[i]; //***incorect?***
else if(buf[i] == " ")
break;
}
问题
它编译时没有错误或警告。但是,当我运行程序时,出现了 segmentation fault 。因此,我正在访问内存,但是我的进程无法访问,并且我猜测我将第一个缓冲区的内容错误地复制到了第二个?
答案 0 :(得分:0)
您根本不会在该代码段中复制任何内容。
first_phrase += buf[i];
将buf中第i个字符的(整数代码)添加到未初始化的指针first_phrase
中。在单元化变量中添加随机数是没有意义的,但这不是违法的。
试图查看统一指针指向的错误是非法的,因为该指针没有指向任何东西。¹您可能稍后在代码中这样做,此时程序将segfault(如果幸运的话)。
¹而且它已经增加到其他一些未指定的值的事实并没有使它或多或少合法。
答案 1 :(得分:0)
您的代码段中有一些错误
1)比较-感到惊讶的是,您对此没有任何警告。
if (buff[i] != " ")
if (buff[i] == " ")
将字符与字符串进行比较。这是行不通的。需要将其更改为
if (buff[i] != ' ')
if (buff[i] == ' ')
2)如评论所述,必须在first_phrase中分配空间,然后才能添加
first_phrase = malloc(strlen(buff) + 1);
分配与输入字符串相同的大小,以防万一字符串中没有空格。为字符串终止符添加1
3)连接到字符串需要一个计数器。 + =添加到指针,因此您要做的就是将first_phrase移动一个大小,但实际上并未添加其内容。像
int fp = -1;
...
for ...
if (buff[i] != ' ')
first_phrase[++fp] = buff[i];
4)在循环结束时,first_phrase需要终止
first_phrase[++fp] = '\0';