我想知道为什么int的两个值即使其为true也不能验证if条件。 printf显示它们两者相等。

缓冲区溢出是否会影响if条件的行为,从而破坏其他代码节的行为。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

  int main(void) {
    srand(time(NULL));
    char instring[2]; // when this increases somehow I get the right behavior
    int inint;
    int guess;
    guess = rand() % 127;
    inint = ~guess;
    printf("%i\n", guess); //testing with printf()
    while (guess != inint) {
      printf("Guess Number\r\n");
      gets(instring);
      inint = atoi(instring);
      printf("%i\n", inint);

      if (inint > guess) {
        printf("%i\n", inint);
        puts("too high");
      } else if (guess > inint) {
        puts("too low");
      } else {
        puts("right");
      }
    }
    return 0;
  }

最佳答案

问题确实在这里。

char instring[2];


现在让我们考虑一下这条线。

gets(instring);


假设您输入10并按Enter。 instring中将包含三个字节。


1
0
终止的null。


instring只能容纳两个字节,但是gets仍将推(至少)三个字节。该多余的字节将溢出到相邻的内存中,从而破坏了其他变量的内存,从而导致一些奇怪的错误。

这就是为什么将instring增大到足以容纳gets结果的原因,从而修复了该程序。

为了避免在使用字符串时出现这种情况,请使用将自身限制为可用内存的函数。在这种情况下,fgets

fgets(instring, sizeof(instring), stdin);


那将限制自己只能读取instring所能容纳的内容。

通常,不要为读取输入而memory小气。一种常见的做法是分配一个大的缓冲区以读取输入,1024个缓冲区是好的,然后仅将该缓冲区用于读取输入。数据将从其中复制到更合适大小的内存中,而atoi可以有效地为您执行此操作。

关于c - C字符串行为和atoi函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49850276/

10-09 07:12