C语言处理多行输入的两种场景与实现方法
在编程竞赛和在线判题系统(如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语言输入技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













