C:变量变为 0 只需在 for 循环中调用 getline
C: Variable turns to 0 simply calling getline inside for loop
在下面的代码(我的源代码的简化版)中,变量 lv
在声明时初始化为 1
,当在内部调用 getline
时神秘地变为 0 for
循环。如果您输入 "cl"
以外的任何内容,或者通过 gdb,您可能会从 printf
中注意到它。变量在 getline
调用后立即更改值。
最奇怪的是提示输入"cl"
时,通过gdb可以看到lv
的值刚好在getline
之后变成了0
,那么就设置正确了到 if
语句中的 3
然后保留用于后续循环,无论您输入什么。
此外,如果您将声明更改为 static int lv = 1;
,则会发生预期的行为(lv
保持为 1
,直到 'manually' 更改)。
谁能告诉我这到底是怎么回事?
#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] = '[=10=]';
}
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,并且 lv
变量在 getline
更新 len
时被覆盖。
只需将 len
声明为 size_t
。
编译器会列出的一个问题是 getline()(在 linux 上)在 stdio.h 中没有原型,除非这样写:
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
编译器还提出了另外两个关于未使用参数的警告 'argc' 和 'argv' 建议将主函数声明更改为:
int main( void )
在下面的代码(我的源代码的简化版)中,变量 lv
在声明时初始化为 1
,当在内部调用 getline
时神秘地变为 0 for
循环。如果您输入 "cl"
以外的任何内容,或者通过 gdb,您可能会从 printf
中注意到它。变量在 getline
调用后立即更改值。
最奇怪的是提示输入"cl"
时,通过gdb可以看到lv
的值刚好在getline
之后变成了0
,那么就设置正确了到 if
语句中的 3
然后保留用于后续循环,无论您输入什么。
此外,如果您将声明更改为 static int lv = 1;
,则会发生预期的行为(lv
保持为 1
,直到 'manually' 更改)。
谁能告诉我这到底是怎么回事?
#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] = '[=10=]';
}
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,并且 lv
变量在 getline
更新 len
时被覆盖。
只需将 len
声明为 size_t
。
编译器会列出的一个问题是 getline()(在 linux 上)在 stdio.h 中没有原型,除非这样写:
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
编译器还提出了另外两个关于未使用参数的警告 'argc' 和 'argv' 建议将主函数声明更改为:
int main( void )