鱼C论坛

 找回密码
 立即注册
查看: 719|回复: 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'的话那就是中间的空行
如果是'#'的话那就是文章开头的空行
改了下代码,现在应该是没什么问题了
#include<stdio.h>
#include<string.h>
void main()
{   
        int i, j, count = 0,space = 0;
        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";
                
        

        for(i=0;(size_t)i<strlen(s);i++)
        {
                if(s[i] == '#')   //出现#开始计数
                {
                        for(j=i+1;(size_t)j<strlen(s);j++)
                        {
                                                        if(s[j] == ' ')   //计算连续空格的个数以便于排除空格的影响
                                                                {
                                                                        space++;
                                                                        continue;
                                                                }
                                                        

                                if(s[j] == '#') //再次出现#停止
                                 {
                                        if(s[j-1] != '\n' && s[j-space-1] != '\n')
                                                count++;
                                        break;
                                }
                                        

                                if(s[j] == '\n') //遇到换行符
                                {
                                                                        
                                        if(s[j-1] != '\n' && s[j-1] != '#' && s[j-space-1] != '\n'&& s[j-1-space] != '#') //判断是否为空行
                                                count++;
                                }
                        
                                    space = 0;
                        }
                }
                break;
        }
        printf("%s", s);
        printf("\n%d\n",count);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

随便写的,可能有更简单的方法
对空行的处理就是看这个'\n'的前一个字符是否为'\n'或'#'还要看他的前面所有空格前的字符是否为'\n'或#
如果是'\n'的话那就是中间的空行
如果是'#'的话那就是文章开头的空行
改了下代码,现在应该是没什么问题了
#include<stdio.h>
#include<string.h>
void main()
{   
        int i, j, count = 0,space = 0;
        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";
                
        

        for(i=0;(size_t)i<strlen(s);i++)
        {
                if(s[i] == '#')   //出现#开始计数
                {
                        for(j=i+1;(size_t)j<strlen(s);j++)
                        {
                                                        if(s[j] == ' ')   //计算连续空格的个数以便于排除空格的影响
                                                                {
                                                                        space++;
                                                                        continue;
                                                                }
                                                        

                                if(s[j] == '#') //再次出现#停止
                                 {
                                        if(s[j-1] != '\n' && s[j-space-1] != '\n')
                                                count++;
                                        break;
                                }
                                        

                                if(s[j] == '\n') //遇到换行符
                                {
                                                                        
                                        if(s[j-1] != '\n' && s[j-1] != '#' && s[j-space-1] != '\n'&& s[j-1-space] != '#') //判断是否为空行
                                                count++;
                                }
                        
                                    space = 0;
                        }
                }
                break;
        }
        printf("%s", s);
        printf("\n%d\n",count);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

int main()
{
        char c;
        while ((c = cin.get()) != '#');
        bool last_is_line = false;
        int count = 0;
        while ((c = cin.get()) != '#')
        {
                if (c == '\n')
                {
                        if (!last_is_line)
                                count++;
                        last_is_line = true;
                } 
                else
                {
                        last_is_line = false;
                }
        }
        cout << count - 1 << endl;
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 17:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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