在下面的代码(我的源代码的简化版本)中,变量lv
在声明时被初始化为1
,当getline时神秘地变成0
在 for
循环内调用。如果您输入除 "cl"
之外的任何内容,您可能会从 printf
或通过 gdb 注意到它。该变量在 getline
调用后立即更改值。
最奇怪的是,当提示输入 "cl"
时,你可能会通过 gdb 看到 lv
的值立即变成 0
getline
,然后在 if
语句中将其正确设置为 3
,然后为后续循环保留,无论您输入什么。
此外,如果将声明更改为 static int lv = 1;
,则会发生预期的行为(lv
保持为 1
直到“手动” ' 已更改)。
有人可以告诉我到底发生了什么事吗?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main ( void ) {
char* line=NULL;
int len;
int lv = 1;
for(;;) {
printf("Level: %d\n", lv);
getline(&line, (size_t*)&len, stdin);
if (line[strlen(line) - 1] == '\n') {
line[strlen(line) - 1] = '\0';
}
if (strcmp(line, "cl")==0) {
lv = 3;
} else if (strcmp(line, "hi")==0) {
printf("Hello World!\n");
} else if (strcmp(line, "quit")==0) {
break;
}
}
return 0;
}
最佳答案
一个合乎逻辑的解释是,在您的平台上,size_t
大于 int
。
如果是这种情况,则您的代码具有 UB,并且当 getline
更新 len
时,lv
变量会被覆盖。
只需将 len
声明为 size_t
。
关于C: 只需在 for 循环内调用 getline 即可将变量变为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30074468/