我应该如何在 c 中存储从 getline() 获得的第一行?
How should I store the first line that got from getline() in c?
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;
}
我试图分开两部分——我输入的第一行和第一行之后的其余字符串...但我不知道为什么我不能成功地单独存储第一行。
为了停止将输入分配给第一(第一行输入),我使用计数来确定我应该在哪里停止,这意味着如果计数为零,这意味着我的输入是第一行。然后在 while 循环中,在你输入第二行之后,你将打印第二行,第一行......我在 else 语句上设置了测试打印机,我发现当我输入第二行时第一行发生了变化。这意味着当跳转到 else 语句时,首先不是打印我想要的(实际第一行)而是与输入相同的行。
我对此很困惑。为什么价值改变了?我应该如何将第一行值存储在单独的 char 数组中?
这是因为你让first
和input
指向同一个内存。赋值 first = input
.
后,两个变量都指向同一内存
您需要 复制 字符串,例如使用strdup
:
first = strdup(input);
另请注意,您使用的是 the getline
function wrong. From the manual page:
If *lineptr
is set to NULL and *n
is set 0 before the call, then getline()
will allocate a buffer for storing the line
对于分配内存的 getline
函数,您也需要将 len
设置为零。 或者自己分配内存。如果 *n
是 not 零,上面的文本暗示 getline
调用不分配内存,但使用指针 *lineptr
因为它是有效的并且指向至少 *n
字节的已分配内存。您有一个空指针,这将导致 *undefined 行为,因为 getline
使用该指针并写入它指向的内存。
请记住,如果您要求 getline
为您分配内存,而您使用 strdup
,那么您需要 free
该内存。
最后,getline
可以修改长度,所以你需要在每次调用前重新设置它。
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;
}
我试图分开两部分——我输入的第一行和第一行之后的其余字符串...但我不知道为什么我不能成功地单独存储第一行。
为了停止将输入分配给第一(第一行输入),我使用计数来确定我应该在哪里停止,这意味着如果计数为零,这意味着我的输入是第一行。然后在 while 循环中,在你输入第二行之后,你将打印第二行,第一行......我在 else 语句上设置了测试打印机,我发现当我输入第二行时第一行发生了变化。这意味着当跳转到 else 语句时,首先不是打印我想要的(实际第一行)而是与输入相同的行。
我对此很困惑。为什么价值改变了?我应该如何将第一行值存储在单独的 char 数组中?
这是因为你让first
和input
指向同一个内存。赋值 first = input
.
您需要 复制 字符串,例如使用strdup
:
first = strdup(input);
另请注意,您使用的是 the getline
function wrong. From the manual page:
If
*lineptr
is set to NULL and*n
is set 0 before the call, thengetline()
will allocate a buffer for storing the line
对于分配内存的 getline
函数,您也需要将 len
设置为零。 或者自己分配内存。如果 *n
是 not 零,上面的文本暗示 getline
调用不分配内存,但使用指针 *lineptr
因为它是有效的并且指向至少 *n
字节的已分配内存。您有一个空指针,这将导致 *undefined 行为,因为 getline
使用该指针并写入它指向的内存。
请记住,如果您要求 getline
为您分配内存,而您使用 strdup
,那么您需要 free
该内存。
最后,getline
可以修改长度,所以你需要在每次调用前重新设置它。