可恶的编程题21/6/6

2021/6/6 12:22:26

本文主要是介绍可恶的编程题21/6/6,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

7-1 单词统计 (100 分)

给定的字符串中只包含#和小写字母,其中#是分隔符,连续的小写字母构成单词。单词内部不会包含#号,也不存在两个单词之间没有#的情况。请你写一个程序来统计一下一行字符串中单词的数量和#的数量。

输入格式:

第一行为一个整数n(0<n<10),代表共有n个字符串。后边n行,每行一个长度不超过100的字符串。

测试用例保证输入合法。

输出格式:

共n行,每行依次对应输入各个字符串。

每行的格式如下:

首先是一个整数,代表单词的数量,跟着是一个空格;然后又是一个整数,代表#的数量,跟着又是一个空格;最后依次输出所有单词,单词之间用一个空格分隔,最后一个单词后边没有空格。如果单词的数量为0,则在应该输出单词的位置输出三个连续的#。

输入样例:

2
#
hello#world

输出样例:

0 1 ###
2 1 hello world

思路 :

num二维数组第一个存单词数,第二个存井号数

word函数原理:碰到井号,判断前一个是不是井号,如果不是,就要在words(存单词)存一个空格,同时井号数+1,第一个和最后一个的情况要单独判断

碰到字母,前面一个如果是井号,单词数加一,存字母。不是,只存字母,开头是字母的情况要单独判断

坑的点:1.说是不会超过100,但是101就是不够,导致我之前一直错,把数组开大一些,就tm过了

2.单词输出末尾空格要去掉,不然格式错误,md

代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//一个函数搞定
//设置全局变量
int num[11][3]={0};
char words[11][150]={0};
void word(char arr[],int n);
//void trim(char *strIn, char *strOut);//去空格函数
int rTrim(char *szBuf);
int main(){
    char a[12][150]={0};
    int n=0;
    scanf("%d",&n);
    int i=0;
    for(i=0;i<n;i++){
        scanf("%s",a[i]);
    }
    for(i=0;i<n;i++){
        //调用函数判断
        char *p=a[i];
        word(p,i);
    }
    int j=0;
    for(i=0;i<n;i++){
        //char strout[100]={0};
        printf("%d %d ",num[i][0],num[i][1]);
        //trim(words[i],strout);
        rTrim(words[i]);
        if(i==n-1)
            printf("%s",words[i]);
        else
            printf("%s\n",words[i]);
    }

}
void word(char arr[],int n){
    int len=strlen(arr);
    char *s=arr;
    int i=0;
    int j=0;
    for(i=0;i<len;i++){
        //如果是井号
        if(s[i]=='#'){

            if(i==0){
                num[n][1]++;
            }
            else if(i==len-1){
                num[n][1]++;

            }
            else if(s[i-1]!='#' && i!=0){
                num[n][1]++;
                words[n][j]=' ';
                j++;
            }
            else if(s[i-1]=='#' && i!=0){
                num[n][1]++;
            }
        }
        else if(s[i]!='#'){//字母
            if(i==0){//头
                num[n][0]++;
                words[n][j]=s[i];
                j++;
            }
            else if(s[i-1]=='#' && i>=1){//前边是井号
                num[n][0]++;
                words[n][j]=s[i];
                j++;
            }
            else if(s[i-1]!='#' && i>=1){
                words[n][j]=s[i];
                j++;
            }
        }
    }
    if(num[n][0]==0){//0个单词
        words[n][0]='#';
        words[n][1]='#';
        words[n][2]='#';
        words[n][3]='\0';

    }
    /*if(num[n][1]==0){
        num[n][0]=0;
        words[n][0]='#';
        words[n][1]='#';
        words[n][2]='#';
        words[n][3]='\0';
    }
    */
}
int rTrim(char *szBuf)//去末尾空格
{
    int i;
    i = strlen(szBuf)-1;
    while(szBuf[i] == ' '&&i >0)
        i--;
    szBuf[i+1] = '\0';

    return 0;

}

 



这篇关于可恶的编程题21/6/6的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程