日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

洛谷 P5734 【深基6.例6】文字处理软件 字符串处理

發布時間:2023/12/29 编程问答 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 洛谷 P5734 【深基6.例6】文字处理软件 字符串处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

洛谷 P5734 【深基6.例6】文字處理軟件

題目描述

你需要開發一款文字處理軟件。最開始時輸入一個字符串(不超過 100 個字符)作為初始文檔。可以認為文檔開頭是第 0 個字符。需要支持以下操作:

1 str:后接插入,在文檔后面插入字符串 str,并輸出文檔的字符串。

2 a b:截取文檔部分,只保留文檔中從第 a 個字符起 b 個字符,并輸出文檔的字符串。

3 a str:插入片段,在文檔中第 a 個字符前面插入字符串 str,并輸出文檔的字符串。

4 str:查找子串,查找字符串 str 在文檔中最先的位置并輸出;如果找不到輸出 -1。

為了簡化問題,規定初始的文檔和每次操作中的 str 都不含有空格或換行。最多會有 q(q\le100)q(q≤100) 次操作。

輸入輸出樣例

輸入
4
ILove
1 Luogu
2 5 5
3 3 guGugu
4 gu

輸出
ILoveLuogu
Luogu
LuoguGugugu
3

分析

字符串初級題目, 個人覺得是初學字符串和熟悉字符串函數很好的一道題目(對大佬們來說很簡單就是了)
根據1,2,3,4不同的要求, 分別想到使用<string.h>中對應的函數

  • 一個字符串結尾接上另一個字符串——strcat/strncat
  • 截取后拷貝到原字符數組——strcpy/strncpy
  • 往字符串中插入一個字符串——截取下原字符串斷點后的部分, 填寫插入語句后, 再使用strcat/strncat接回原字符串末尾
  • 在已知字符串中查找某一字符串——strstr
  • 另外, 可以使用puts()函數打印一個字符串, 該函數末尾自帶一個\n, 且效率要高于printf().


    代碼

    #include<stdio.h> #include<string.h> int main(void) {char a[110] = {0}, temp[110]; //注意初始化int q;scanf("%d", &q);scanf("%s", a);while(q--){int x, start, num, i, end, j;memset(temp,0,sizeof(temp));scanf("%d", &x);if( x==1){scanf("%s", temp);strncat(a, temp, strlen(temp));puts(a);}else if( x==2){scanf("%d %d", &start, &num);for( i=0; i<num; i++, start++){temp[i] = a[start];}temp[i] = '\0'; // strncpy(a,temp,strlen(temp)); //錯誤, 會多一部分字符 strcpy(a,temp);puts(a);}else if( x==3){scanf("%d", &end);for(i=end, j=0; a[i]!='\0'; i++, j++){temp[j] = a[i];}temp[j] = '\0';scanf("%s", &a[end]);strncat(a, temp, strlen(temp));puts(a);}else{scanf("%s", temp);if( strstr(a,temp)==NULL) //strstr的返回值為 *char 或 NULL{printf("-1\n"); //puts()用習慣了,用回printf()時注意\n}else{char *p = strstr(a,temp); // printf("a=%d\n", a); // printf("p=%d\n", p); // printf("a=%p\n", a); // printf("p=%p\n", p);printf("%d\n", (p-a)); }}} }

    收貨與反思

  • 熟悉了幾種<string.h>庫函數的用法 strcat(), strcpy(), strstr(), puts().
  • 首次在題目中使用指針(雖然已經學過很久, 但是一直怕用錯), 感覺盡量要多使用, 以熟悉它. 比如本題中strstr()函數返回值即為所求字符串首字符地址, 調試后發現 (其實是想起來) char的空間(?字節?地址大小?)只有1, 所以最后用兩地址直接相減就是所在位置的序號了
  • 本題WA了兩大次, 第一次是沒看到"如果找不到,則返回-1"這個要求, 第二次是"-1"后忘記加"\n"了… 這兩個失誤(尤其第二個)害的我找錯找了將近1個小時… 注意之后吸取教訓.
  • 代碼中有一條語句值得細說一下:
    scanf("%s", &a[end]);
    與下面這條語句對比一下:
    scanf("%s", a);
    可以發現這兩條語句后都是地址值. 之前對數組的地址和值的理解不是很深, 所以一直只會把字符串輸入到數組"0下標"開始的位置, 之后再有類似的題目, (如果有需要)可以放到"1下標"的位置了
  • 總結

    以上是生活随笔為你收集整理的洛谷 P5734 【深基6.例6】文字处理软件 字符串处理的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。