我正在开发一个处理字母集的C程序。但是,我遇到了一个问题。由于某种原因,代码一次打印消息Enter next element of Set A
两次,因此它不会要求输入两行中的第一行。
例如:
If the size of Set A is 5, the program will print:
Enter first element of Set A:(user inputs f)
Enter next element of Set A:(doesn't allow user to input value) <--printed at same time with line below
Enter next element of Set A:(allows a user input)
Enter next element of Set A:(doesn't allow user to input value) <--printed at same time with line below
Enter next element of Set A:(allows a user input)
以下是代码:
void getSetA(bool setA[], int sizeA)
{
letters element, letter;
int position = 0, num;
printf("\nEnter the first element in Set A: ");
element = getchar();
for(letter = a; letter <= z; letter++)
{
if(element == letter) setA[position + 1] = true;
else position++;
}
for(num = 1; num <= sizeA -1; num++)
{
printf("\nEnter next element of Set A: ");
element = getchar();
for(letter = a; letter <= z; letter++)
{
if(element == letter) setA[position + 1] = true;
else position++;
}
}
}
请注意,我将字母定义为字母表中的所有字母,而setA是boolean类型的数组。 sizeA是用户先前输入的Set A的大小。
提前谢谢。
答案 0 :(得分:1)
您遇到的问题是getchar()
只从输入缓冲区中抓取一个字符。这样就可以了,除了输入缓冲区中仍然有一个新行,这是因为点击&#39;进入&#39;输入后..您需要在使用getchar()
之后清除输入缓冲区:
char c;
while ((c = getchar()) != '\n' && c != EOF);// the second part is only if you are working with files
答案 1 :(得分:1)
您的代码似乎跳过其他所有行的原因是getchar
返回所有字符,包括行尾标记。要解决此问题,请编写包含getchar
的自己的函数,并跳过所有\n
和\r
字符:
int getcharNoBreaks() {
int ret;
do {
ret = getchar();
} while (ret == '\n' || ret == '\r');
return ret;
}
将getcharNoBreaks
或其原型放在getSetA
之前,并将getchar
的所有来电替换为getcharNoBreaks
,以解决当前问题。
然而,代码重复的一个更大问题仍将存在:您的代码会自行重复,这绝不是一个好主意。考虑切换for
循环以支持do
/ while
,这与我在getcharNoBreaks
中使用的类似,以达到您尝试通过放置另一个副本来实现的效果循环之前的代码。
最后,没有必要遍历所有字母以查看element
是否是其中之一:您可以使用单个if
替换整个循环:
if (element >= 'a' && element <= 'z') {
set[element-'a'] = true;
}