0

该程序调用两个函数 uppercase() 将输入转换为大写,shift() 将输入的等级转换。

这是我的大写()函数:

void uppercase(char *p)
{

 if(islower(*p)) {
    *p = toupper(*p);
    }

}

这是 shift() 函数:

void shift(char *p1, char *p2, char *p3, char *p4)
{
 int count = 0;
 do {
 ++count;
 char tmp;
 tmp = *p4;
 *p4 = *p3;
 *p3 = *p2;
 *p2 = *p1;
 *p1 = tmp;
 printf("Grades Shifted #%i:   %c %c %c %c \n", count, *p1, *p2, *p3, *p4);
 } while (count < 4);

}

这是我的主要功能。

#include <stdio.h>
#include <ctype.h>
main (void)
{
 float choice;

 do {
 char c1, c2, c3, c4;
 printf ("Enter 4 letter grades to find statistics: ");
 scanf("%c %c %c %c", &c1, &c2, &c3, &c4);
 getchar();

 uppercase(&c1);
 uppercase(&c2);
 uppercase(&c3);
 uppercase(&c4);

 printf("Input Grades: %c %c %c %c\n", c1, c2, c3, c4);
 shift(&c1, &c2, &c3, &c4);
 printf("Want to shift more grades (y/n)? ");
 choice = getchar();    
 } while ( choice == 'y' || choice == 'Y');
getchar();

}

我的输出看起来像这样

输入 4 个字母的成绩以查找统计数据:abcd
输入成绩:ABCD
成绩转移#1:DABC
成绩转移#2:CDAB
成绩转移#3:BCDA
成绩转移#4:ABCD
想要转移更多成绩(y/n)?y
输入 4 个字母的成绩以查找统计数据:adff
输入成绩:
ADF
等级转移 #1:FA
AD
等级转移#2:DF
A
等级转移#3:ADF
等级转移#4:
ADF
想要转移更多等级 (y/n) ?

格式在第二次输入时变得混乱,当我在第二次输入后输入另一个 y 时,程序关闭。在过去的一个小时里,我一直在修补这个问题,但我无法弄清楚为什么我的格式会变得混乱,或者为什么循环在第三次尝试时关闭/崩溃。

另外,我怎样才能使我的主要功能只接受 AD 或 F 的输入。

谢谢。

4

2 回答 2

3

我认为这是因为您的 getchar() 输入中有一个新行

当您输入“y”然后按回车时,您将得到“y\n”。

重新进入do while循环时清除输入

printf("Want to shift more grades (y/n)? ");
choice = getchar();
c = getchar();
while (c != '\n' && c != EOF)
  c = getchar();
} while ( choice == 'y' || choice == 'Y');

对于你的第二个问题:

您需要检查 c1,c2,c3,c4 的值 幸运的是有一个函数

while( !(isalpha(c1) && isalpha(c2) && isalpha(c3) && isalpha(c4)) )
  printf ("Enter 4 letter grades to find statistics: ");
  scanf("%c %c %c %c", &c1, &c2, &c3, &c4);
  getchar();

请注意,isalpha 函数只是检查每个字符的值……这是一个 ascii 表,注意 AZ 和 az 的位置。http://www.asciitable.com/


scanf/getchar() 行清除:http ://www.velocityreviews.com/forums/t318260-peek-at-stdin-flush-stdin.html

于 2013-05-15T03:40:05.703 回答
0

您可以使用 scanf() 而不是 getchar() 因为 scanf 将停止,直到它到达一个空格

于 2013-05-15T03:49:43.687 回答