【发布时间】:2021-01-07 18:43:30
【问题描述】:
这是代码:
void inserisciStringa(int dim, char *i) {
int men = 1;
do {
if (scanf("%[^\n]s", i) == 1) {
svuotaBuffer(); // I think this is the problem
int len = checkStrLen(men, dim, i);
int num = checkNumbers(len, i);
if (len && num)
break;
}
printf("\nError");
printf("\nTry again: ");
} while (1);
}
int checkStrLen(int min, int max, char *s) {
int len = strlen(s);
if (len >= min && len <= max)
return len;
else
return 0;
}
int checkNumbers(int len, char *s) {
int i;
for (i = 0; i < len; i++) {
if (s[i] >= '0' && s[i] <= '9') {
printf("\nNot Numbers");
return 0;
}
}
}
void svuotaBuffer() {
char c;
do {
c = getchar();
} while(c != '\n');
}
每次我必须插入一个字符串时,由于svuotaBuffer(),我不得不按两次回车。
但如果我删除它,我有无限循环。
我可以以某种方式修复它吗?我注意到它并不总是这样做,但这是一个非常烦人的问题
【问题讨论】:
-
@user3121023 问题可能是我在调用函数后仍在使用'svuotaBuffer()'
-
请将
scanf("%[^\n]s", i)更改为scanf(" %[^\n]", i),其中有两个更改:添加空间,删除s。并删除 kludgesvuotaBuffer();这是添加空间的工作。 -
你不能像那样构建你的 scanf 循环。如果你写
do { if( scanf(...) == 1 ) break; } while(1);,你会运行一个无限循环的非常真实的可能性,在这个循环中,scanf 反复尝试处理相同的数据并且永远不会在输入流上取得任何进展。 -
@WeatherVane 添加的空间仅从空间中清除缓冲区
svoutaBuffer()清除缓冲区中的任何内容,直到遇到\n。它们并不完全相同。 -
@Davide 空格过滤缓冲区中的所有前导空格,无论有多少,无论是否有。这使得
%[]和%c的行为类似于自动执行此操作的其他格式规范。我称它为kludge是有原因的。如果可能需要清除不需要的非空白内容,最好使用fgets()而不是scanf()并完成它。