int main(){
char *input = NULL;
char *first = NULL;
size_t len = 100;
int count = 0;
while(getline(&input, &len, stdin)!= EOF){
if(count == 0){
first = input;
printf("------>%s, count = %d\n", first, count);//test printer
}
else{
printf("%d, %s, %s\n", count, input, first);//test printer
}
count++;
}
return 0;
}
我试图分开两个部分 - 我输入的第一行和第一行后的其余字符串...但我不知道为什么我不能单独成功存储第一行。
为了停止将输入分配给第一个(第一行输入),我使用count来确定我应该在哪里停止,这意味着如果count为零,这意味着我的输入是第一行。然后在while循环中,在您输入的第二行之后,您将打印第二行,第一行...我在else语句上设置测试打印机,我发现第一行在输入第二行时发生了变化。这意味着当跳转到else语句时,首先不是打印我想要的(实际的第一行),而是输入相同的行。
我对此很困惑。为什么价值变了?我应该如何将第一行值存储在单独的char数组中?
答案 0 :(得分:3)
这是因为你使first
指向与input
相同的内存。在赋值first = input
之后,两个变量都指向相同的内存。
您需要复制字符串,例如,使用例如strdup
:
first = strdup(input);
另请注意,您使用的是the getline
function错误。来自the manual page:
如果
*lineptr
在调用之前设置为NULL 且*n
设置为0 ,那么getline()
将分配一个用于存储行的缓冲区
对于getline
函数来分配内存,您需要将len
设置为零。 或自己分配内存。如果*n
不为零,则上述文本暗示getline
调用不分配内存,但使用指针*lineptr
,因为它有效并指向已分配内存至少*n
个字节。你有一个空指针,这将导致*未定义的行为,因为getline
使用该指针并写入它指向的内存。
请记住,如果您要求getline
为您分配内存,并使用strdup
,那么您需要free
该内存。
最后,getline
可以修改长度,因此您需要在每次调用之前重置它。