鱼C论坛

 找回密码
 立即注册
查看: 875|回复: 2

[已解决]C语言-求有字符的行数

[复制链接]
发表于 2020-11-6 20:02:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
每个作文都以一行#开始。随后是若干行字符,然后再以#结束。

作文中不会出现#。

输出每个作文有多少行。(空行不算)

输入:
#
I love C programming language!
Yes, I'm xiaomeng.
   haha!


another paragraph. I'm so smart!
bye!

#

输出:5

怎么敲代码呀!!特别是对空行怎么处理呀
最佳答案
2020-11-6 21:45:36
本帖最后由 1471590985 于 2020-11-6 22:49 编辑

随便写的,可能有更简单的方法
对空行的处理就是看这个'\n'的前一个字符是否为'\n'或'#'还要看他的前面所有空格前的字符是否为'\n'或#
如果是'\n'的话那就是中间的空行
如果是'#'的话那就是文章开头的空行
改了下代码,现在应该是没什么问题了
  1. #include<stdio.h>
  2. #include<string.h>
  3. void main()
  4. {   
  5.         int i, j, count = 0,space = 0;
  6.         char s[] = "#\nI love C programming language!\n\nYes, I'm xiaomeng. \n  haha!\nanother paragraph. I'm so smart!\n\nbye\n  \n#eqd";
  7.                
  8.        

  9.         for(i=0;(size_t)i<strlen(s);i++)
  10.         {
  11.                 if(s[i] == '#')   //出现#开始计数
  12.                 {
  13.                         for(j=i+1;(size_t)j<strlen(s);j++)
  14.                         {
  15.                                                         if(s[j] == ' ')   //计算连续空格的个数以便于排除空格的影响
  16.                                                                 {
  17.                                                                         space++;
  18.                                                                         continue;
  19.                                                                 }
  20.                                                        

  21.                                 if(s[j] == '#') //再次出现#停止
  22.                                  {
  23.                                         if(s[j-1] != '\n' && s[j-space-1] != '\n')
  24.                                                 count++;
  25.                                         break;
  26.                                 }
  27.                                        

  28.                                 if(s[j] == '\n') //遇到换行符
  29.                                 {
  30.                                                                        
  31.                                         if(s[j-1] != '\n' && s[j-1] != '#' && s[j-space-1] != '\n'&& s[j-1-space] != '#') //判断是否为空行
  32.                                                 count++;
  33.                                 }
  34.                         
  35.                                     space = 0;
  36.                         }
  37.                 }
  38.                 break;
  39.         }
  40.         printf("%s", s);
  41.         printf("\n%d\n",count);
  42. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-11-6 21:45:36 | 显示全部楼层    本楼为最佳答案   
本帖最后由 1471590985 于 2020-11-6 22:49 编辑

随便写的,可能有更简单的方法
对空行的处理就是看这个'\n'的前一个字符是否为'\n'或'#'还要看他的前面所有空格前的字符是否为'\n'或#
如果是'\n'的话那就是中间的空行
如果是'#'的话那就是文章开头的空行
改了下代码,现在应该是没什么问题了
  1. #include<stdio.h>
  2. #include<string.h>
  3. void main()
  4. {   
  5.         int i, j, count = 0,space = 0;
  6.         char s[] = "#\nI love C programming language!\n\nYes, I'm xiaomeng. \n  haha!\nanother paragraph. I'm so smart!\n\nbye\n  \n#eqd";
  7.                
  8.        

  9.         for(i=0;(size_t)i<strlen(s);i++)
  10.         {
  11.                 if(s[i] == '#')   //出现#开始计数
  12.                 {
  13.                         for(j=i+1;(size_t)j<strlen(s);j++)
  14.                         {
  15.                                                         if(s[j] == ' ')   //计算连续空格的个数以便于排除空格的影响
  16.                                                                 {
  17.                                                                         space++;
  18.                                                                         continue;
  19.                                                                 }
  20.                                                        

  21.                                 if(s[j] == '#') //再次出现#停止
  22.                                  {
  23.                                         if(s[j-1] != '\n' && s[j-space-1] != '\n')
  24.                                                 count++;
  25.                                         break;
  26.                                 }
  27.                                        

  28.                                 if(s[j] == '\n') //遇到换行符
  29.                                 {
  30.                                                                        
  31.                                         if(s[j-1] != '\n' && s[j-1] != '#' && s[j-space-1] != '\n'&& s[j-1-space] != '#') //判断是否为空行
  32.                                                 count++;
  33.                                 }
  34.                         
  35.                                     space = 0;
  36.                         }
  37.                 }
  38.                 break;
  39.         }
  40.         printf("%s", s);
  41.         printf("\n%d\n",count);
  42. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-7 14:48:37 | 显示全部楼层
逐个字符读取并且处理
  1. #include <iostream>
  2. using namespace std;

  3. int main()
  4. {
  5.         char c;
  6.         while ((c = cin.get()) != '#');
  7.         bool last_is_line = false;
  8.         int count = 0;
  9.         while ((c = cin.get()) != '#')
  10.         {
  11.                 if (c == '\n')
  12.                 {
  13.                         if (!last_is_line)
  14.                                 count++;
  15.                         last_is_line = true;
  16.                 }
  17.                 else
  18.                 {
  19.                         last_is_line = false;
  20.                 }
  21.         }
  22.         cout << count - 1 << endl;
  23.         return 0;
  24. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-12 18:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表