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

Java实现从文件读取两位数并跳过空白字符/字符串

解决文件提取两位数的问题

看起来你的问题出在读取逻辑上——当用常规的整数读取函数(比如scanf)遇到非数字内容时,它会直接卡住,不会自动跳过那些无关内容。我来给你两种可行的解决思路和代码示例,帮你提取文件里所有的两位数,完全忽略空白和字符串:

方法一:逐字符读取处理

这种方法适合处理大文件,不受行长度限制,逐字符扫描文件,只捕捉连续的两个数字字符:

#include <stdio.h>
#include <ctype.h>

#define MAX_DIGITS 100  // 定义数组最大容量

int main() {
    FILE *file = fopen("your_file.txt", "r");
    if (!file) {
        perror("无法打开文件");
        return 1;
    }

    int two_digit_nums[MAX_DIGITS];
    int count = 0;
    char current_char;
    int temp_num;

    while ((current_char = fgetc(file)) != EOF) {
        // 遇到数字字符时,尝试读取下一个字符判断是否能组成两位数
        if (isdigit(current_char)) {
            temp_num = (current_char - '0') * 10;  // 十位数字
            current_char = fgetc(file);
            
            // 如果下一个字符也是数字,组合成两位数
            if (current_char != EOF && isdigit(current_char)) {
                temp_num += (current_char - '0');
                // 确保是两位数(其实这里必然满足,保险起见加个判断)
                if (temp_num >= 10 && temp_num <= 99) {
                    if (count < MAX_DIGITS) {
                        two_digit_nums[count++] = temp_num;
                    } else {
                        printf("数组已满,无法继续存储更多数据\n");
                        break;
                    }
                }
            } else {
                // 如果下一个不是数字,把字符放回缓冲区,继续处理后续内容
                if (current_char != EOF) {
                    ungetc(current_char, file);
                }
            }
        }
        // 非数字字符直接跳过,进入下一次循环
    }

    fclose(file);

    // 输出提取到的两位数
    printf("提取到的两位数列表:\n");
    for (int i = 0; i < count; i++) {
        printf("%d ", two_digit_nums[i]);
    }
    printf("\n");

    return 0;
}

方法二:按行读取后扫描

这种方法更直观,先读取整行内容,再在每行里扫描符合条件的两位数,适合调试和处理结构化的文件:

#include <stdio.h>
#include <ctype.h>
#include <string.h>

#define MAX_DIGITS 100
#define MAX_LINE_LENGTH 256  // 定义每行最大长度

int main() {
    FILE *file = fopen("your_file.txt", "r");
    if (!file) {
        perror("无法打开文件");
        return 1;
    }

    int two_digit_nums[MAX_DIGITS];
    int count = 0;
    char line[MAX_LINE_LENGTH];

    while (fgets(line, MAX_LINE_LENGTH, file) != NULL) {
        char *ptr = line;
        while (*ptr != '\0') {
            // 找到数字字符时,检查下一个字符是否也是数字
            if (isdigit(*ptr) && isdigit(*(ptr + 1))) {
                int num = (ptr[0] - '0') * 10 + (ptr[1] - '0');
                if (num >= 10 && num <= 99) {
                    if (count < MAX_DIGITS) {
                        two_digit_nums[count++] = num;
                    } else {
                        printf("数组已满,停止读取\n");
                        goto cleanup;  // 跳转到文件清理步骤
                    }
                }
                ptr++;  // 已经处理了两个字符,跳过一个避免重复扫描
            }
            ptr++;
        }
    }

cleanup:
    fclose(file);

    // 输出结果
    printf("提取到的两位数列表:\n");
    for (int i = 0; i < count; i++) {
        printf("%d ", two_digit_nums[i]);
    }
    printf("\n");

    return 0;
}

为什么你的原代码会停止?

你之前的代码大概率用了scanf("%d", &num)这类函数,这类函数遇到非数字字符时会读取失败,并且把那个非数字字符留在输入缓冲区里,后续的scanf会一直读取这个无效字符,导致程序陷入死循环或者直接停止。上面两种方法都是通过主动跳过非数字内容,只捕捉连续的两个数字,完美解决这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:40:52