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; }