You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

关键逻辑说明

  1. 读取输入:用fgets读取完整的机票号码字符串,相比逐个字符读取,更易处理整体长度和分离最后一位。
  2. 清理输入:移除fgets自带的换行符,避免影响后续字符串操作。
  3. 分离最后一位:通过字符串长度直接定位最后一个字符,转换为整数后单独保存。
  4. 计算余数:遍历前面的所有数字,逐步计算它们组成的数除以7的余数(每次计算都取余,避免数值溢出)。
  5. 验证输出:比较余数和最后一位数字,输出验证结果。

如果坚持用逐个字符读取的方式,也可以通过预读下一个字符判断是否到达最后一位,不过字符串处理的方式更直观易懂。

内容的提问来源于stack exchange,提问作者Angus Todd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:15:42