字符串的输入输出处理(C语言蓝桥杯)

第一行是一个正整数N,最大为100。
之后是多行字符串(行数大于N), 每一行字符串可能含有空格,字符数不超过1000。
输出
先将输入中的前N行字符串(可能含有空格)原样输出,
再将余下的字符串(不含有空格)以空格或回车分割依次按行输出。
每行输出之间输出一个空行。
样例输入
2
www.dotcpp.com DOTCPP
A C M
D O T CPP
样例输出
www.dotcpp.com DOTCPP

A C M

D

O

T

CPP
题目来源:https://www.dotcpp.com/oj/problem1094.html

思路分析:通过题目的要求,可以明确知道,在前n行,是将整行的字符串原样输出的,但是之后的每一行字符串,只要遇到一个空格,就会发生换行,输出空格前的字符串,遇到换行符也是一样,将这个换行符前的字符串输出,并且,每一次输出之间,都有一行进行分割
所以这里针对输出n行之后的字符串时,利用到了字符串输入中比较巧妙的地方了:scanf("%s",字符串变量名),通过这种方式输入字符串,那么这种方式输入到底有什么巧妙之处呢?
我们都知道,通过scanf("%s",字符串变量名)这种方式输入字符串,只要遇到了空格/制表符/换行符,scanf函数就会认为字符串已经输入结束了,自动在字符串后面加上结束标记。例如输入Welcome to C,通过这种方式输入,最后输出的字符串只有Welcome。所以只要通过这一种方式输入后面n行的字符串,就能有效的解决通过空格或者换行符进行分割输出。
完整代码:

#include<stdio.h>
int main()
{
   int n,i = 1;
   char msg[1001];
   scanf("%d",&n);
   /*
   这一步十分重要的,如果没有这一步,那么这时候就会导致下面没有办法输入字
   */
   getchar();
   for(i = 1; i <= n; i++){
   /*
   针对前n行的情况,利用gets进行输入字符串(gets函数输入字符串的时候,只有遇到换行符
   才会认为输入结束,并且自动在字符串后面添加自动结束标志,所以空格/制表符会作为字符
   保留在字符串中),同时在通过puts函数输出字符串之后,还有输出一行,使输出的每一行字符
   串之间有一个空行分割着
   */
       gets(msg);
       puts(msg);
       printf("\n");
   }
   while(scanf("%s",msg) != EOF){
   /*
   针对n行之后的情况,这里利用了scanf函数输入字符串,puts函数输出字符串
   输出字符串之后,还要输出一个空行,从而使得每一行字符串都有一个空行分割着
    */
       puts(msg);
       printf("\n");
   }
   return 0;
}

输出结果:
在这里插入图片描述
说的不好的地方,请大家指正哈!!!

刚刚受到读者的评论,说没有需要再输入n之后,需要输入一个getchar(),它的作用是什么呢?那么我们来检验一下,如果没有getchar()会发生什么?
没有getchar()语句对应的代码

#include<stdio.h>
int main()
{
   int n,i = 1;
   char msg[1001];
   scanf("%d",&n);
   //getchar();//这一步十分重要的
   for(i = 1; i <= n; i++){
   /*
   针对前n行的情况,利用gets进行输入字符串(gets函数输入字符串的时候,只有遇到换行符
   才会认为输入结束,并且自动在字符串后面添加自动结束标志,所以空格/制表符会作为字符
   保留在字符串中),同时在通过puts函数输出字符串之后,还有输出一行,使输出的每一行字符
   串之间有一个空行分割着
   */
       gets(msg);
       puts(msg);
       printf("\n");
   }
   while(scanf("%s",msg) != EOF){
   /*
   针对n行之后的情况,这里利用了scanf函数输入字符串,puts函数输出字符串
   输出字符串之后,还要输出一个空行,从而使得每一行字符串都有一个空行分割着
    */
       puts(msg);
       printf("\n");
   }
   return 0;
}

对应的运行结果和含有getchar()语句的结果进行比较:
在这里插入图片描述
如果还是不太能构理解,那么请参考下面的博客:
https://blog.csdn.net/peterXu00800/article/details/73467555?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161841162316780269832076%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=161841162316780269832076&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allbaidu_landing_v2~default-1-73467555.first_rank_v2_pc_rank_v29&utm_term=gets%E6%B2%A1%E6%9C%89%E8%BE%93%E5%85%A5

如果有说的不是很好的地方,还请大家多多指教哈!!!

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值