我想知道为什么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/