C语言中如何优雅、准确、高效地设计和处理输入输出

DOS系统、Linux系统、Windows系统均有处理输入输出命令的命令行窗口。那么在用C语言处理编写命令行程序时,该如何准确、高校地设计和处理输入输出呢?笔者在参加国内一些算法考试时,接触过一些需要处理输入输出的情景,本文介绍几种情况下的实用方法,希望能帮得到你。

一、准备工作

#include <stdio.h> 包含此头文件到.c文件中,是处理输入输出的大前提。

二、需要输入行数、列数的情况,逻辑断点为空格

比如,请在第一行输入两个参数,两个参数用空格分开,第一个参数N代表行数,第二个参数M代表列数;从第二行开始,每一行输入M个整型数,之间用空格分开。请设计输入输出程序接收一个N*M的数据。

3 4

1 2 3 4

5 6 7 8

9 0 1 2

答案:可以直接用scanf函数接收参数,此函数的逻辑断点是以空格或者换行符为终止符的。

cpp 复制代码
int N,M;

scanf("%d", &N);

scanf("%d", &M);

int data[N][M]

for(int i=0; i<N; i++)

{

        for(int j=0; j<M; j++)

        {

                scanf("%d", &(data[i][j]));

        }

}

三、需要输入行数、但是列数未知的情况

(1)情况1:数据之间的逻辑断点为',' ':','-'的情况。

比如,请在第一行输入1个参数,第一个参数N代表行数;从第二行开始,每一行输入x个整型数,之间用逗号','分开,但是每一行的数据个数未知。请设计输入输出程序接收一个N行的数据。(行数最大为300,列数最大为300)。

3

1,2,3,4,5,6,7,8,9,10,100

5,6,7,8

9,0,1,2

答案:可以通过scanf("%s",usrstr)将一行数据接受为字符串,然后再根据分割符逐个提取数据。

cpp 复制代码
int N;

scanf("%d", &N);



int data[300][300];

int rowsize=N;

int colsize[N];

memset(colsize, 0, sizeof(colsize));



char usrstr[3000];

for(int i=0; i<N; i++)

{

        scanf("%s", usrstr);

        char* cmd = strtok(usrstr, ",");

        while(cmd!=NULL)

        {

                data[i][(colsize[i])++]= atoi(cmd);

               cmd = strtok(NULL, ",");

        }

}

(2)情况2:数据之间的逻辑断点为空格' '的情况。

比如,请在第一行输入1个参数,第一个参数N代表行数;从第二行开始,每一行输入x个整型数,之间用空格' '分开,但是每一行的数据个数未知。请设计输入输出程序接收一个N行的数据。(行数最大为300,列数最大为300)。

3

1 2 3 4 5 6 7 8 9 10 100

5 6 7 8

9 0 1 2

答案:可以通过fgets(usrstr, sizeof(uststr), stdin)将一行数据接受为字符串,然后再根据分割符逐个提取数据。

cpp 复制代码
int N;

scanf("%d", &N);



int data[300][300];

int rowsize=N;

int colsize[N];

memset(colsize, 0, sizeof(colsize));



char usrstr[3000];

 fgets(usrstr, sizeof(uststr), stdin);  // 接收多余的回车符

for(int i=0; i<N; i++)

{

        fgets(usrstr, sizeof(uststr), stdin);

        char* cmd = strtok(usrstr, " ");

        while(cmd!=NULL)

        {

                data[i][(colsize[i])++]= atoi(cmd);

               cmd = strtok(NULL, " ");

        }

}

四、输入行数、输入列数都未知的情况

(1)情况1:数据之间的逻辑断点为',' ':','-'的情况。

比如,请在第一行x1个整型数,第二行输入x2个整型数,之间用逗号','分开,但是每一行的数据个数x未知,而且行数是未知的。请设计输入输出程序接收此N行的数据,N和每行的列数都是未知的。(行数最大为300,列数最大为300)。

1,2,3,4,5,6,7,8,9,10,100

5,6,7,8

9,0,1,2

注意最后一行,为了通知命令行输入结束,重新换行并且输入control+z+回车换行结束输入

答案:可以通过while(scanf("%s",usrstr)!=EOF){}将一行数据接受为字符串,然后再根据分割符逐个提取数据,直到遇到EOF终止符。

cpp 复制代码
   int data[300][300];

    int rowsize=0;

    int colsize[300];

    memset(colsize, 0, sizeof(colsize));



    char usrstr[3000];

    while(scanf("%s", usrstr)!=EOF)  // 遇到文件终止符号EOF,EOF的值为-1

    {

        char* cmd = strtok(usrstr, ",");

        while(cmd!=NULL)

        {

            data[rowsize][(colsize[rowsize])++]= atoi(cmd);

            cmd = strtok(NULL, ",");

        }

        rowsize++;

    }

   

    for(int i=0; i<rowsize; i++)

    {

        for(int j=0; j<colsize[i]; j++)

            printf("%d ",data[i][j]);

        printf("\r\n");

    }

(2)情况2:数据之间的逻辑断点为空格' '的情况。

比如,请在第一行x1个整型数,第二行输入x2个整型数,之间用空格' '分开,但是每一行的数据个数x未知,而且行数是未知的。请设计输入输出程序接收此N行的数据,N和每一行列数都是未知的。(行数最大为300,列数最大为300)。

1 2 3 4 5 6 7 8 9 10 100

5 6 7 8

9 0 1 2

注意最后一行,为了通知命令行输入结束,重新换行并且输入control+z+回车换行结束输入

答案:可以通过fgets(usrstr, sizeof(usrstr), stdin)!=NULL){}将一行数据接受为字符串,然后再根据分割符逐个提取数据,直到遇到EOF终止符返回为NUL值。

cpp 复制代码
    int data[300][300];

    int rowsize=0;

    int colsize[300];

    memset(colsize, 0, sizeof(colsize));



    char usrstr[3000];

    while(fgets(usrstr, sizeof(usrstr), stdin)!=NULL)

    {  

        char* cmd = strtok(usrstr, " ");

        while(cmd!=NULL)

        {

            data[rowsize][(colsize[rowsize])++]= atoi(cmd);

            cmd = strtok(NULL, " ");

        }

        rowsize++;

    }

   

    for(int i=0; i<rowsize; i++)

    {

        for(int j=0; j<colsize[i]; j++)

            printf("%d,",data[i][j]);

        printf("\r\n");

    }
相关推荐
坚果派·白晓明14 小时前
鸿蒙PC】libuv适配:AtomCode Skills一站式指南
c语言·c++·华为·ai编程·harmonyos·atomcode
绵绵细雨中的乡音14 小时前
监控显示一切正常,可用户根本打不开网站——Blackbox Exporter帮我找到了真相(1)
开发语言·php
c++之路14 小时前
CMake 系列教程(五):进阶技巧
c语言·开发语言·c++
踏着七彩祥云的小丑14 小时前
Go学习第5天:变量作用域 + 数组 + 指针
开发语言·学习·golang·go
Sam_Deep_Thinking14 小时前
java中的class到底是个什么东西?
java·开发语言·面试
资深流水灯工程师14 小时前
PySide6 QMainWindow与QWidget秒解
开发语言·python
字节高级特工14 小时前
智能指针原理与使用场景全解析
开发语言·c++·算法
码界索隆15 小时前
Python转Java系列:面向对象基础
java·开发语言·python
逻辑星辰15 小时前
x-ds-pow-response逆向分析
开发语言·人工智能·python·深度学习·算法
AI科技星15 小时前
《全域数学/数术工坊》体系总览
c语言·开发语言·汇编·electron·概率论