#include <stdio.h> int main(int argc, char *argv[]) { printf("\t-----售票系统-----\t\n"); int n,m; char x; printf("请输入年龄进行购票:"); scanf("%d",&n); if(n>16&&n<=88) printf("票价:50元\n"); else if(n>=1&&n<=16) printf("票价:30元\n"); printf("请开始投币购买:"); scanf("%d",&m); if( (n>=1&&n<=16)&&m>30 ) printf("应补%d元\n",m-30); else if ( (n>=1&&n<=16)&&m<30 ) printf("应给您%d元\n",30-m); else if ( (n>16&&n<=88)&&m<50 ) printf("应给%d元\n",50-m); else if ( (n>16&&n<=88)&&m>50 ) printf("应补您%d元\n",m-50); printf("是否需要小票(y/n):"); scanf("%c",&x); if(x=='y') { printf("\t-----消费清单-----\t\n"); printf("\t--消费%d元-----\t\n",m); if( (n>=1&&n<=16)&&m>30 ) printf("\t--应补%d元-----\t\n",m-30); else if ( (n>=1&&n<=16)&&m<30 ) printf("\t--应给%d元-----\t\n",30-m); else if ( (n>16&&n<=88)&&m<50 ) printf("\t--应给%d元-----\t\n",50-m); else if ( (n>16&&n<=88)&&m>50 ) printf("\t--应补%d元-----\t\n",m-50); printf("购票完成,旅途愉快!"); } else if(x=='n') printf("购票完成,旅途愉快!"); return 0; }
这个代码按逻辑来说是没有任何问题的,一个简单的售票系统但是在运行到是否需要小票这里就直接突然中断不在往下进行运行。
解决方案:
这段代码在读取字符 x
的时候确实存在一个问题,这通常是由于在输入投币金额 m
后,按回车键(Enter)时会在输入缓冲区中留下一个换行符 \n
。当程序尝试使用 scanf("%c", &x);
读取字符时,它会立即读取到这个换行符,而不是用户期望输入的 'y' 或 'n'。
为了解决这个问题,你需要在读取字符 x
之前清除输入缓冲区中的换行符。一个简单的方法是使用 getchar()
函数来读取并丢弃这个额外的换行符。然而,getchar()
只会读取一个字符,如果缓冲区中有多个字符(比如用户之前按下的多个回车键),那么它可能无法完全清除缓冲区。
为了更可靠地清除输入缓冲区,你可以使用一个循环来读取并丢弃字符,直到遇到换行符为止。这里是一个改进后的代码段,用于在读取字符 x
之前清除输入缓冲区:
int c; // 清除输入缓冲区中的剩余字符 while ((c = getchar()) != '\n' && c != EOF); printf("是否需要小票(y/n):"); scanf(" %c", &x); // 注意在%c前面有一个空格,它会跳过任何空白字符(包括空格、制表符和换行符)
请注意,scanf(" %c", &x);
中的空格是一个重要的部分,它会告诉 scanf
跳过任何前置的空白字符(包括换行符、空格和制表符),然后读取下一个非空白字符。
另外,你的代码逻辑部分看起来是正确的,只要输入是正确的,它应该能按照预期工作。但是,为了提高代码的健壮性,你可能还想添加一些错误检查来处理非数字输入或超出范围的输入。
下面是包含上述修改后的完整代码:
#include <stdio.h> int main(int argc, char *argv[]) { printf("\t-----售票系统-----\t\n"); int n, m; char x; int c; printf("请输入年龄进行购票:"); scanf("%d", &n); if (n > 16 && n <= 88) { printf("票价:50元\n"); } else if (n >= 1 && n <= 16) { printf("票价:30元\n"); } printf("请开始投币购买:"); scanf("%d", &m); // ...(票价计算和投币计算的逻辑保持不变)... // 清除输入缓冲区中的剩余字符 while ((c = getchar()) != '\n' && c != EOF); printf("是否需要小票(y/n):"); scanf(" %c", &x); // 注意在%c前面有一个空格 if (x == 'y') { printf("\t-----消费清单-----\t\n"); // ...(打印消费清单的逻辑保持不变)... printf("购票完成,旅途愉快!\n"); } else if (x == 'n') { printf("购票完成,旅途愉快!\n"); } else { printf("无效输入,程序将退出。\n"); } return 0; }
转载请注明:宗宗酱-(电击小子)++>C语言售票系统代码