我遇到一个问题,经过多次测试后,我认为这是因为我不了解输入缓冲区的工作原理。
我有一个while循环,它应该继续迭代,直到用户输入“no”来停止迭代。
我有两个问题。
CODE:
int foo = 0;
do{
int i, cycles;
char array[MAX_LENGTH+1];
for(cycles=0; cycles < MAX_READ_CYCLES; cycles++){
i=0;
printf("\n\nEnter a string: ");
char ch;
while ((ch = getchar()) != '\n' && ch != EOF) {
array[i] = ch;
i++;
}
array[i] = '\0'; //string terminator
printf("String you entered: %s\n", array);
printf("\nDo you want to continue? 1: yes / 0: no \n");
scanf("%d", &foo);
}
} while( foo == 1);
输出
Enter a string: test
String you entered: test
Do you want to continue? 1: yes / 0: no
0
Enter a string: String you entered:
Do you want to continue? 1: yes / 0: no
3
Enter a string: String you entered:
Do you want to continue?
答案 0 :(得分:5)
如果用户因内部"yes"
循环而输入for
,则您的程序不会终止:
#include <stdio.h>
#include <string.h>
#define MAX_LENGTH 100
#define MAX_READ_CYCLES 100
int main() {
int cycles = 0;
char foo[4];
do {
char array[MAX_LENGTH + 1];
printf("\n\nEnter a string: ");
char ch;
int i = 0;
while ((ch = getchar()) != '\n' && ch != EOF) {
array[i] = ch;
i++;
}
array[i] = '\0'; //string terminator
printf("String you entered: %s\n", array);
printf("\nDo you want to continue?");
scanf("%s", foo);
cycles++;
while ((ch = getchar()) != '\n' && ch != EOF); // force drop stdin
} while (strcmp(foo, "yes") == 0 && cycles < MAX_READ_CYCLES);
}
另见I am not able to flush stdin和http://c-faq.com/stdio/stdinflush2.html
答案 1 :(得分:0)
您正在创建一个3字节的字符数组,然后将三个以上的字节存储到其中。不要忘记,最后会有一个空值。由于您没有分配足够的空间,因此您将覆盖其他内存位置,这些位置将始终创建未定义的行为。
另请注意,此处的scanf非常不安全。初始化像这样的字符数组也是无效的:char foo[3]="";