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
相关产品推荐
相关产品推荐

