gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:27:51 25 4
gpt4 key购买 nike

此程序调用两个函数 uppercase() 和 shift(),前者将输入转换为大写,后者转换成绩输入。

这是我的 uppercase() 函数:

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();

}

我的输出看起来像这样

Enter 4 letter grades to find statistics: abcd
Input Grades: A B C D
Grades Shifted #1: D A B C
Grades Shifted #2: C D A B
Grades Shifted #3: B C D A
Grades Shifted #4: A B C D
Want to shift more grades (y/n)? y
Enter 4 letter grades to find statistics: adff
Input Grades:
A D F
Grades Shifted #1: F
A D
Grades Shifted #2: D F
A
Grades Shifted #3: A D F
Grades Shifted #4:
A D F
Want to shift more grades (y/n)?

第二个输入的格式变得困惑,当我在第二个输入后输入另一个 y 时,程序关闭。在过去的一个小时里,我一直在修补这个问题,但我不明白为什么我的格式会搞砸,或者为什么循环在第三次尝试时关闭/崩溃。

还有我怎样才能让我的主要功能只接受 A-D 或 F 的输入。

谢谢。

最佳答案

我认为这是因为您的 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

关于c - 循环转换为大写字母并在 C 中移动 4 个字母等级的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16556386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com