处理集合问题的C程序

时间:2013-08-04 10:54:45

标签: c arrays set

我正在开发一个处理字母集的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的大小。

提前谢谢。

2 个答案:

答案 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;
}