C语言处理多行输入的两种场景与实现方法

Ryan
Ryan
发布时间:2026-10-15 | 3人浏览过
原创

在编程竞赛和在线判题系统(如LeetCode、牛客网)中,多行输入是常见的测试用例格式。C语言处理这类数据时,需根据是否预先知道输入行数采取不同的循环策略。本文将详细解析利用scanf配合EOF或位运算处理不定长输入,以及通过计数器处理定长输入的多种实现方式。

一、未明确具体输入行数

当题目未规定具体的输入行数时,通常需要通过检测文件结束符(End Of File)来终止循环。在本地Windows环境下测试时,这通常通过快捷键Ctrl + Z模拟;而在远程判题系统中,由系统自动注入结束信号。

第1步:使用按位取反判断scanf返回值

scanf函数返回成功匹配的变量个数。当遇到文件结尾且无有效输入时,其返回值为-1。对-1进行按位取反(~ -1),结果为0,可用于退出循环。

char str[10][10]; // 定义二维数组存储多个字符串
int i = 0;

// ~scanf返回0时退出循环
while (~scanf("%s", str[i]))
{
    i++;
}

注意:每输入一行并按回车即视为一次完整的输入动作。在Windows命令行调试时,需在行首按下Ctrl + Z,部分编译器环境可能需要连续按两次以确认输入流结束。

第2步:直接比较EOF常量

这是更直观的写法,直接检查scanf的返回值是否等于宏EOF(通常为-1)。

char str[10][10];
int i = 0;

// 当返回值不等于EOF时继续循环
while (scanf("%s", str[i]) != EOF)
{
    i++;
}

第3步:验证返回值的数量

如果确信每次只输入一个元素,可以判断返回值是否为1。若输入流中断或格式错误,返回值将不为1,从而跳出循环。

char str[10][10];
int i = 0;

// 仅当成功读取1个元素时循环
while (scanf("%s", str[i]) == 1)
{
    i++;
}

二、已知具体输入行数

若题目明确要求输入N行数据,则不需要依赖文件结束符,直接使用循环次数作为控制条件即可。这种方式在性能上略优,且在逻辑上更为清晰。

第4步:设定固定循环次数

首先读取整数N,随后执行N次输入操作。

char str1[10][10];
int num = 10; // 假设已知需要输入10行
int i = 0;

while (num--)
{
    scanf("%s", &str1[i]);
    i++;
}

三、数据类型与分隔符的差异

上述代码主要针对char型字符串。对于整型(int)或浮点型(float/double)数据,空格键和换行符(\n)均可作为数据的分隔界限。scanf会自动跳过前置的空格和空白字符,直到找到非空白字符为止。

第5步:多变量同时输入

在实际操作中,常需要一次性读入同一行的多个数值。无论这些数值间使用的是空格还是回车分隔,程序均能正确解析。

int N = 0;
// 第一行读取总行数
scanf("%d", &N);

for (int i = 1; i <= N; i++)
{
    // 第二行起,每行读取三个整数
    scanf("%d %d %d", &first[i], &second[i], &third[i]);
    printf("%d %d %d\n", first[i], second[i], third[i]);
}

如图所示,在使用空格或换行间隔不同数值的情况下,程序的最终输出结果保持一致。这是因为scanf在处理非字符串格式化参数时,具备自动忽略中间空白符的特性。

总结

C语言中的多行输入处理核心在于循环终止条件的选择。对于不确定长度的数据流,利用EOF或其变种(如位运算取反)是标准做法;对于确定数量的数据集,则应优先使用计数器。理解字符串与数值在分隔符处理上的细微差别,有助于编写更健壮的OJ代码。

以上就是C语言处理多行输入的详细内容,更多关于C语言输入技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表