C语言机票号码有效性验证程序开发问题求助
机票号码有效性验证代码修复
你的代码问题在于把所有输入数字都纳入了余数计算,没有区分最后一位和前面的部分,导致无法完成验证逻辑。下面是修复后的代码,同时附上逻辑说明:
修复后的代码
#include <stdio.h> #include <string.h> int main() { char ticket[20]; // 假设机票号码长度不超过20位,可按需调整 printf("Enter a ticket number: "); fgets(ticket, sizeof(ticket), stdin); // 移除fgets读取到的换行符 size_t len = strlen(ticket); if (len > 0 && ticket[len - 1] == '\n') { ticket[len - 1] = '\0'; len--; } // 处理空输入情况 if (len == 0) { printf("Error: Empty ticket number entered.\n"); return 1; } // 提取最后一位数字 int last_digit = ticket[len - 1] - '0'; int remainder = 0; // 计算前面所有数字组成的数除以7的余数 for (int i = 0; i < len - 1; i++) { remainder = (remainder * 10 + (ticket[i] - '0')) % 7; } // 验证有效性并输出结果 if (remainder == last_digit) { printf("Valid ticket number.\n"); } else { printf("Invalid ticket number.\n"); } return 0; }
关键逻辑说明
- 读取输入:用
fgets读取完整的机票号码字符串,相比逐个字符读取,更易处理整体长度和分离最后一位。 - 清理输入:移除
fgets自带的换行符,避免影响后续字符串操作。 - 分离最后一位:通过字符串长度直接定位最后一个字符,转换为整数后单独保存。
- 计算余数:遍历前面的所有数字,逐步计算它们组成的数除以7的余数(每次计算都取余,避免数值溢出)。
- 验证输出:比较余数和最后一位数字,输出验证结果。
如果坚持用逐个字符读取的方式,也可以通过预读下一个字符判断是否到达最后一位,不过字符串处理的方式更直观易懂。
内容的提问来源于stack exchange,提问作者Angus Todd
相关产品推荐
相关产品推荐

