01-07 字符串练习

敲笨钟程序

题目及代码

7-7 敲笨钟 (20分)
微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。为了增加敲钟的趣味性,还会糟改几句古诗词。其糟改的方法为:去网上搜寻压“ong”韵的古诗词,把句尾的三个字换成“敲笨钟”。例如唐代诗人李贺有名句曰:“寻章摘句老雕虫,晓月当帘挂玉弓”,其中“虫”(chong)和“弓”(gong)都压了“ong”韵。于是这句诗就被糟改为“寻章摘句老雕虫,晓月当帘敲笨钟”。

现在给你一大堆古诗词句,要求你写个程序自动将压“ong”韵的句子糟改成“敲笨钟”。

输入格式:
输入首先在第一行给出一个不超过 20 的正整数 N。随后 N 行,每行用汉语拼音给出一句古诗词,分上下两半句,用逗号 , 分隔,句号 . 结尾。相邻两字的拼音之间用一个空格分隔。题目保证每个字的拼音不超过 6 个字符,每行字符的总长度不超过 100,并且下半句诗至少有 3 个字。

输出格式:
对每一行诗句,判断其是否压“ong”韵。即上下两句末尾的字都是“ong”结尾。如果是压此韵的,就按题面方法糟改之后输出,输出格式同输入;否则输出 Skipped,即跳过此句。

输入样例:
5
xun zhang zhai ju lao diao chong, xiao yue dang lian gua yu gong.
tian sheng wo cai bi you yong, qian jin san jin huan fu lai.
xue zhui rou zhi leng wei rong, an xiao chen jing shu wei long.
zuo ye xing chen zuo ye feng, hua lou xi pan gui tang dong.
ren xian gui hua luo, ye jing chun shan kong.
输出样例:
xun zhang zhai ju lao diao chong, xiao yue dang lian qiao ben zhong.
Skipped
xue zhui rou zhi leng wei rong, an xiao chen jing qiao ben zhong.
Skipped
Skipped

#include<stdio.h>
#include<string.h>
int main(void) {
    
    
    int n;
    scanf("%d", &n);
    char str[200][5000];
    char ch1[] = "ong,", ch2[] = "ong.", ch3 []= {
    
     "qiao ben zhong." };
    getchar();//这两行不加的话 读取的str[0]的结果为输入n后的回车
    for (int i = 0; i < n; i++) {
    
    
        fgets(str[i], 200, stdin);
    }
    for (int i = 0; i < n; i++) {
    
    
        if (strstr(str[i], ch1) != NULL && strstr(str[i], ch2) != NULL) {
    
    
            int m = strlen(str[i]);
            int j=m,count=0,p;
            for( j;j>0;j--){
    
    
                if(str[i][j]==' '){
    
    
                    count++;
                }
                if(count==3){
    
    
                    p=m-j;
                    break;
                }
            }
            strncpy(&str[i][m-p+1], ch3, 200);
            printf("%s\n",str[i]);
        }
        else {
    
    
            printf("Skipped\n");
        }
    }
    return 0;
}

知识点

fgets

函数获取一行字符,fgets的参数有三个,可以通过第一个参数的不同类型,比如一维数组,获取任意行数据

char *  fgets(char * s, int n,FILE *stream);   //函数原型

warning:
fgets遇到第一个换行符会将其储存在字符串中,遇到回车就读取
在此例中,n后有一个回车,本例用getchar()获取单个字符的特性保存了’\n’,否则读取出错;

strstr

此函数定义在<string.h>标准库中

const char *my_strstr(const char *str, const char *sub_str)  

主要功能为在str1中查找是否包含str2子串,如果包含则返回str1中str2子串的首元素地址,否则返回NULL.
warning:
在使用或者处理strstr(str1,str2)返回值之前,切记不要对str1字符串进行更改,若要更改,应该等使用完返回值后再更改!!

strncpy

此函数定义在<string.h>标准库中
可以将其理解为覆盖而不是复制

char *strncpy(char *dest, const char *src, size_t n)

把 src 所指向的字符串复制到 dest,最多复制 n 个字符。当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充。
warning:
s1指向的应该是位置,其返回值为覆盖后的字符串

英文单词排序

题目及代码

本题要求编写程序,输入若干英文单词,对这些单词按长度从小到大排序后输出。如果长度相同,按照输入的顺序不变。

输入格式:
输入为若干英文单词,每行一个,以#作为输入结束标志。其中英文单词总数不超过20个,英文单词为长度小于10的仅由小写英文字母组成的字符串。

输出格式:
输出为排序后的结果,每个单词后面都额外输出一个空格。

输入样例:
blue
red
yellow
green
purple

输出样例:
red blue green yellow purple

#include<stdio.h>
#include<string.h>
int main(void){
    
    
    char str[20][10],ch[10],t[20];
    int n=0;
    while(1){
    
    
        scanf("%s",ch);
        if(ch[0]=='#'){
    
    
            break;
        }else{
    
    
            strncpy(str[n],ch,10);
            n++;
        }
    }
    for(int i=0;i<n-1;i++){
    
    
        for(int j=0;j<n-i-1;j++){
    
    
            if(strlen(str[j])>strlen(str[j+1])){
    
    
                strcpy(t,str[j]);
                strcpy(str[j],str[j+1]);
                strcpy(str[j+1],t);
            }
        }
    }
    for(int i=0;i<n;i++){
    
    
        printf("%s ",str[i]);
    }
    return 0;
}

知识点

排序算法
此例调用两次循环通过相邻单词间的字母比较进行排序
通过使用strcpy函数进行相邻易位
warning:
strncpy是strcpy的安全形式,少s3(字符数)

A-B

本题要求你计算A−B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。

输入格式:
输入在2行中先后给出字符串A和B。两字符串的长度都不超过10
​4
​​ ,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。

输出格式:
在一行中打印出A−B的结果字符串。

输入样例:
I love GPLT! It’s a fun game!
aeiou
输出样例:
I lv GPLT! It’s fn gm!

题目及代码

#include<stdio.h>
#include<string.h>
int main(void){
    
    
    char str1[100000],str2[100000];
    fgets(str1,100000,stdin);
    int m=strlen(str1);
    fgets(str2,100000,stdin);
    int len=strlen(str2),j;
    for(int i=0;str1[i]!='\0';i++){
    
    
        for( j=0;j<len;j++){
    
    
            if(str1[i]==str2[j]){
    
    
                break;
            }
        }
        if(j==len)
            printf("%c",str1[i]);
    }
    return 0;
}

知识点

核心为判断算法
worning:
切勿混淆使用strpbrk函数

char*strpbrk(const char*s1,const char*s2);

如果s1包含s2任意字符,函数返回指向s1字符串首字符位置的指针
若未找到,则返回空字符(NULL)

猜你喜欢

转载自blog.csdn.net/qq_27528193/article/details/112342263
今日推荐