循环转换为大写的程序并在C中移动4个字母的等级

时间:2013-05-15 03:34:55

标签: c

这个程序调用两个函数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
  输入等级:A B C D
  等级#1:D A B C
  等级#2:C D A B
  等级#3:B C D A
  等级#4:A B C D
  想转移更多成绩(y / n)? ÿ
  输入4个字母的等级来查找统计数据:adff
  输入成绩:
   A D F
  等级#1:F
   A D
  等级#2:D F
   一个
  等级#3:A D F
  等级变换#4:
   A D F
  想转移更多成绩(y / n)?

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

另外,我怎样才能使我的主函数只接受A-D或F的输入。

感谢。

2 个答案:

答案 0 :(得分: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表,注意A-Z和a-z的位置。 http://www.asciitable.com/


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

答案 1 :(得分:0)

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