字符串查找(重復(fù)次數(shù))

目的:

首先用戶輸入一個(gè)字符串噪服,然后再次輸入一個(gè)字符串黔寇,然后輸出第二個(gè)字符串在第一個(gè)字符串中出現(xiàn)的次數(shù)灵巧。

步驟

1.分配內(nèi)存
2.從終端接收字符串
3.比較長(zhǎng)度
4.比較
5.輸出

分配內(nèi)存

int main(){
    char str1[100] = {};
    char str2[100] = {},*p1,*p2;
    
    printf("請(qǐng)輸入語(yǔ)句\n");
    Myscanf(str1);
    
    printf("請(qǐng)輸入單詞\n");
    Myscanf(str2);

接收字符串抬虽。

  • scanf不能輸入帶空格的字符串
    略号,只能自己定義一個(gè)輸入語(yǔ)句的方法
void Myscanf(char *str){
    int i = 0;
    while (1) {
        char c = getchar();
        if (c == '\n') {
            str[i] = '\0';
            break;
        }
        str[i] = c;
        i++;
    }
}

比較長(zhǎng)度

如果第二次輸入的字符串比第一次輸入的長(zhǎng)刑峡,那么沒有必要進(jìn)行比較洋闽,所以首先進(jìn)行長(zhǎng)度比較

int length(char *p){
    int i = 0;
    //for (; p[i] != '\0'; i++);
    while (1) {
        if (p[i] == '\0') {
            break;
        }
        i++;
    }
    return i;
}
int find(char *sentence, char *word){
    //1.獲取兩個(gè)字符串的長(zhǎng)度
    int sLength = length(sentence);
    int wLength = length(word);
    //2.判斷查詢的字符串長(zhǎng)度是否比句子短
    if (sLength < wLength) {
        return 0;
    }

如果字符串一比字符串二長(zhǎng),那么就進(jìn)行比較

方法一
int time;
    p1 = str1;
    p2 = str2;
    while(*p1 != '\0'){
        if((*p1 == *p2)){
            while((*p1 == *p2)&&(*p2 != '\0')) {
                p1++;
                p2++;   
            }
        }
        else
            p1++;
        if(*p2 == '\0'){
                time++;
                p2 = str2;
        }
    }
    printf("重復(fù)的次數(shù)為%d次",time);
    getchar();
   
 return 0;
 }
方法二
int start = 0;
    int count = 0;
    for (int i = 0; i < sLength; i++) {
        //記錄當(dāng)前開始的位置
        start = i;
        
        //從當(dāng)前位置開始去和查找的單詞進(jìn)行比較
        int j = 0;
        for(; j < wLength; j++){
            //判斷j對(duì)應(yīng)的值和start+j比較
            if (sentence[start+j] != word[j]) {
                break;
            }
        }
        
        //判斷怎么出來(lái)的
        if (j == wLength){
            //都相同
            //將i的值定位到start+j的位置
            i = start + j-1;
            
            count++;
        }
    }
    
    return count;
}
    

  • 可以看到突梦,最開始用數(shù)組分配內(nèi)存诫舅,已經(jīng)設(shè)定了兩個(gè)數(shù)組的長(zhǎng)度,由于輸入的字符串的長(zhǎng)度是未知的阳似,難免就會(huì)造成內(nèi)存空間的不足或浪費(fèi)骚勘。
    所以我們可以進(jìn)行動(dòng)態(tài)分配內(nèi)存。

動(dòng)態(tài)分配內(nèi)存

原因

1.存儲(chǔ)的數(shù)據(jù)需要延長(zhǎng)生命周期
2.一個(gè)指針變量需要存儲(chǔ)數(shù)據(jù)撮奏,變量本身只能存地址俏讹,不能存數(shù)據(jù),需要分配內(nèi)存空間來(lái)存儲(chǔ)數(shù)據(jù)

特點(diǎn)

1.不需要預(yù)先分配儲(chǔ)存空間
2.分配的空間可以根據(jù)程序的需要擴(kuò)大或縮小畜吊。

過程

頭文件為<stdlib.h>
1.定義指針p泽疆,

2.分配數(shù)組空間,用來(lái)存儲(chǔ)數(shù)組元素玲献,空間大小按元素個(gè)數(shù)計(jì)算殉疼;

3.按一維數(shù)組方式使用這個(gè)數(shù)組

若是一維數(shù)組,則元素為p[i]捌年;若是二維數(shù)組瓢娜,則元素為p[i*M+j],其中M為列元素個(gè)數(shù)

4.釋放數(shù)組空間

例如:

char *name礼预;

name = (char *)malloc(10*sizeof(char));
//1.用malloc申請(qǐng)內(nèi)存空間
name = (char *)realloc(name,20*sizeof(char));
//2.使用realloc動(dòng)態(tài)改變已經(jīng)分配內(nèi)存的大小
free(name)
//3.手動(dòng)釋放內(nèi)存

對(duì)于動(dòng)態(tài)分配內(nèi)存眠砾,可以舉如下例子

輸入人名,并為其分配內(nèi)存托酸。


#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

//從終端接收字符串 返回這個(gè)字符串的首地址
char *inputName(){
    //1.定義一個(gè)指針變量 指向字符串的首地址
    char *pName = NULL;
    //2.接收輸入褒颈。一定要進(jìn)行指針初始化。
    int i = 0;
    //3.提示操作
    printf("請(qǐng)輸入人名:");
    while (1) {
        //接收一個(gè)字符
        char c = getchar();
        //判斷這個(gè)字符是不是\n
        if (c == '\n') {
            //輸入結(jié)束
            break;
        }
        //判斷是不是第一個(gè)字符
        if(i == 0){
            //使用malloc分配內(nèi)存
            pName = (char *)malloc(1*sizeof(char));
            //判斷是否分配成功
            if(pName == NULL){
                exit(EXIT_FAILURE);
            }
            pName[0] = c;
        }else{
            //使用realloc在之前的基礎(chǔ)上加一個(gè)
            pName = realloc(pName, (i+1)*sizeof(char));
            //判斷是否分配成功
            if(pName == NULL){
                exit(EXIT_FAILURE);
            }
            pName[i] = c;
        }
        
        i++;
    }
    //將當(dāng)前的字符串首地址返回
    return pName;
}

是否繼續(xù)

bool isContinue(){
    printf("是否繼續(xù)(y/n)?:");
    while (1) {
        char c = getchar();
        getchar();
        if (c == 'y'){
            return true;
        }else if(c == 'n'){
            return false;
        }else{
            printf("輸入格式不對(duì)励堡,請(qǐng)重新輸入:");
        }
    }
}

輸入人名 將地址放到pHead對(duì)應(yīng)位置

//初始化整個(gè)數(shù)組
char **initNames(int *pNum){
    //1.定義指針變量指向每個(gè)名字的首地址的內(nèi)存
    char **pHead = NULL;
    
    //2.記錄元素個(gè)數(shù)
    int i = 0;
    while (1) {
        //判斷是不是第一個(gè)
        //第一個(gè)使用malloc分配內(nèi)存
        if (i == 0) {
            pHead = malloc(1*sizeof(char *));
            if (pHead == NULL) {
                exit(EXIT_FAILURE);
            }
            
            //輸入人名 將地址放到pHead對(duì)應(yīng)位置
            pHead[0] = inputName();
        }else{
            //使用realloc重新再增加一個(gè)元素
            pHead = realloc(pHead, (i+1)*sizeof(char *));
            if (pHead == NULL) {
                exit(EXIT_FAILURE);
            }
            //輸入人名 將地址放到pHead對(duì)應(yīng)位置
            pHead[i] = inputName();
        }
        
        i++;
        
        //是否繼續(xù)
        bool result = isContinue();
        if (result == false) {
            break;
        }
    }
    
    *pNum = i;
    return pHead;
}

輸入人名

void show(char **pHead, int num){
    printf("輸入%d個(gè)名字:\n",num);
    for (int i = 0; i < num; i++) {
        printf("%s\n",pHead[i]);
    }
    printf("\n");
}

主函數(shù)

int main(int argc, const char * argv[]) {
    char **pHead = NULL;
    int count = 0;
    pHead = initNames(&count);
    show(pHead, count);
    return 0;
}

可以觀察到谷丸,運(yùn)用函數(shù)實(shí)現(xiàn)功能,使得主函數(shù)非常簡(jiǎn)潔应结。

注意

在使用完內(nèi)存空間之后刨疼,一定要手動(dòng)釋放內(nèi)存!


作者有話說(shuō)

如果可以摊趾,大家連上自己的熱點(diǎn)再寫簡(jiǎn)書吧币狠,因?yàn)檫@個(gè)校園網(wǎng)可能不知道什么時(shí)候就悄悄咪咪的就給你斷掉了!即使斷掉了,也不要像我一樣去點(diǎn)刷新砾层!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市贱案,隨后出現(xiàn)的幾起案子肛炮,更是在濱河造成了極大的恐慌止吐,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侨糟,死亡現(xiàn)場(chǎng)離奇詭異碍扔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)秕重,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門不同,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人溶耘,你說(shuō)我怎么就攤上這事二拐。” “怎么了凳兵?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵百新,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我庐扫,道長(zhǎng)饭望,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任形庭,我火速辦了婚禮铅辞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘萨醒。我一直安慰自己斟珊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布验靡。 她就那樣靜靜地躺著倍宾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胜嗓。 梳的紋絲不亂的頭發(fā)上高职,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音辞州,去河邊找鬼怔锌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛变过,可吹牛的內(nèi)容都是我干的埃元。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼媚狰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼岛杀!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起崭孤,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤类嗤,失蹤者是張志新(化名)和其女友劉穎糊肠,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體遗锣,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡货裹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了精偿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弧圆。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖笔咽,靈堂內(nèi)的尸體忽然破棺而出搔预,到底是詐尸還是另有隱情,我是刑警寧澤拓轻,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布斯撮,位于F島的核電站,受9級(jí)特大地震影響扶叉,放射性物質(zhì)發(fā)生泄漏勿锅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一枣氧、第九天 我趴在偏房一處隱蔽的房頂上張望溢十。 院中可真熱鬧,春花似錦达吞、人聲如沸张弛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吞鸭。三九已至,卻和暖如春覆糟,著一層夾襖步出監(jiān)牢的瞬間刻剥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工滩字, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留造虏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓麦箍,卻偏偏與公主長(zhǎng)得像漓藕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挟裂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容