2

我正在开发一个处理字母集的 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 是布尔类型的数组。sizeA 是用户之前输入的 Set A 的大小。

先感谢您。

4

2 回答 2

1

您遇到的问题是getchar()只从输入缓冲区中抓取一个字符。这会很好,除了输入缓冲区中仍然有一个换行符是由于在您输入后点击“输入”而导致的。您需要在使用后清除输入缓冲区,getchar()如下所示:

char c;
while ((c = getchar()) != '\n' && c != EOF);// the second part is only if you are working with files
于 2013-08-04T11:00:23.793 回答
1

您的代码似乎每隔一行跳过的原因是getchar返回所有字符,包括行尾标记。为了解决这个问题,编写你自己的 wrap 函数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;
}
于 2013-08-04T11:01:12.123 回答