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

如何为C语言矩阵输入代码添加用户输入验证功能?

C语言二维数组输入验证:确保每行元素数量匹配列数

你的原始代码

#include <stdio.h>

int main() {
    int x, y, i, j;
    printf("number of rows: ");
    scanf("%d", &x);

    printf("number of columns: ");
    scanf("%d", &y);

    int sample_arr[x][y];

    printf("\nEnter elements of the array:\n\n");

    for (i = 0; i < x; i++){
        printf("Row %d: ", i+1);
        for (j = 0; j < y; j++){
            scanf("%d", &sample_arr[i][j]);
        }
    }
    // 后续代码省略
    return 0;
}

当前问题

当输入的元素数量少于列数时,程序会一直等待输入,没有任何提示,用户无法快速定位问题。需要实现输入验证:如果每行输入的元素数量不等于列数,立即提示错误并重新要求用户输入该行。

解决方案

核心思路是先读取整行输入,再解析其中的数字并统计数量,以此判断输入是否符合要求。具体实现如下:

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

int main() {
    int x, y, i, count, num;
    char buffer[1024]; // 存储整行输入内容

    printf("number of rows: ");
    scanf("%d", &x);

    printf("number of columns: ");
    scanf("%d", &y);

    // 清空scanf留下的换行符,避免fgets读取空行
    getchar();

    int sample_arr[x][y];

    printf("\nEnter elements of the array:\n\n");

    for (i = 0; i < x; i++){
        while(1) {
            printf("Row %d: ", i+1);
            // 读取整行输入
            if (fgets(buffer, sizeof(buffer), stdin) == NULL) {
                // 处理输入异常
                return 1;
            }

            count = 0;
            char *ptr = buffer;
            int offset;

            // 解析行内所有整数并计数
            while (sscanf(ptr, "%d%n", &num, &offset) == 1) {
                if (count < y) {
                    sample_arr[i][count] = num;
                }
                count++;
                ptr += offset; // 移动指针到下一个数字起始位置
            }

            // 验证元素数量是否匹配列数
            if (count == y) {
                break; // 输入正确,进入下一行
            } else {
                printf("请确保您输入的元素数量与列数一致,以构成矩阵!\n");
            }
        }
    }

    // 可选:输出验证后的矩阵
    printf("\n你输入的矩阵是:\n");
    for (i = 0; i < x; i++) {
        for (int j = 0; j < y; j++) {
            printf("%d ", sample_arr[i][j]);
        }
        printf("\n");
    }

    return 0;
}

关键说明

  1. 清空输入缓冲区:scanf读取行数和列数后,缓冲区会残留换行符,调用getchar()可避免fgets直接读取空行。
  2. 整行读取:用fgets获取用户输入的整行内容,确保能捕获所有输入的数字和分隔符。
  3. 数字解析与计数:通过sscanf循环解析行内整数,%n用于获取本次解析消耗的字符数,方便移动指针定位下一个数字;同时统计解析到的数字数量。
  4. 验证与重试:若统计的数字数量不等于列数y,输出提示并重新读取该行,直到输入符合要求为止。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:23:13