C: 只需在 for 循环内调用 getline 即可将变量变为 0

标签 c variables for-loop static getline

在下面的代码(我的源代码的简化版本)中,变量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/

相关文章:

与 char 和常量的比较总是失败

javascript - 根据变量值找到变量键

java - 使用 'advanced' 为每个循环在 Java 中初始化一个数组

javascript - 如何在 ng-repeat 中为变量设置类

C释放内存的问题,valgrind错误

c - 矩形矩阵复杂度

c++ - C 程序 : Get inode header fields and information by inode number

php - 在 {php} 标签中使用 smarty 变量

javascript - 在Nodejs中创建临时对象

c - 将 for 循环放入三元运算中