程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言經典編程之字符串

C語言經典編程之字符串

編輯:關於C語言

C語言經典編程之字符串


1、按特定順序輸出壓縮

輸入一段字符串,把相同的字符按出現順序,歸在一起,並壓縮。

例如:

輸入:SamSameCome

輸出:

SSaammmeeCo

S2a2m3e2C1o1

【難度系數】 ▲ ▲ ▲ ▲

【分析】

【代碼】

#include 
#include 

int main(void)
{
    char ch[100];
    char str[100];
    char s;
    int i = 0;
    int j = 0;
    int count = 1;
    int k = 0;

    scanf("%s", ch);

    for(i = 0; i < strlen(ch); i++)
    {
        if(ch[i] != ' ')
        {
            s = ch[i];
            for(j = 0; j < strlen(ch); j ++)
            {
                if(s == ch[j])
                {
                    str[k] = ch[j];
                    k++;
                    ch[j] = ' ';
                }
            }
        }
    }
    printf("%s\n", str);

    for(i = 0; i < strlen(str); i++)
    {
        if(str[i] == str[i + 1])
        {
            count ++;
        }
        else
        {
            printf("%c%d", str[i], count);
            count = 1;
        }
    }
    printf("\n");
    return 0;
}

2、IP地址判斷是否合法

輸入一個IP地址,判斷時候ip地址合法

ip地址由4位0-255組成 中間使用 . 隔開

合法的ip地址是:

21.45.34.112 是合法的

第一位不能為全0

0.45.34.112 是不合法的

每一位不能超過255

【代碼】

#include 
#include 
#include 

int main(void)
{
    char ip[20] = {};
    int i = 0, j = 0;
    int num[4] = {};
    
    scanf("%[^\n]", ip);
    
    char *sep = ".";
    char *p = strtok(ip, sep);
    
    while(p != NULL)
    {
        num[i ++] = atoi(p);
        p = strtok(NULL, sep);
    }
    
    if(num[0] == 0 || num[0] >255 || num[1] > 255
       || num[2] > 255 || num[3] > 255)
        printf("NO\n");
    else
        printf("YES\n");
    
    return 0;
}

3、字符串壓縮

字符串原地壓縮。題目描述:“eeeeeaaaff" 壓縮為 "e5a3f2"。

字符串壓縮算法,把s字符串壓縮處理後結果保存在res中

比如:

輸入

aaaaeefggg

輸出為

a4e2f1g3

輸入

hhfhhhhff

輸出為

h2f1h4h2

【代碼】

#include 
#include 

int main(void)
{
    char ch[100];
    int i = 0;
    int count = 1;
    
    scanf("%s", ch);
    
    for(i = 0; i < strlen(ch); i++)
    {
        if(ch[i] == ch[i + 1])
        {
            count ++;
        }
        else
        {
            printf("%c%d", ch[i], count);
            count = 1;
        }
    }
    
    return 0;
}

4、字符串解壓

字符串原地壓縮。題目描述:"e5a3f2" 解壓縮為 “eeeeeaaaff"。

字符串壓縮算法,把s字符串壓縮處理後結果保存在res中

比如:

輸入

a4e2f1g3

輸出為

aaaaeefggg

輸入

h2f1h4h2

輸出為

hhfhhhhff

【代碼】

#include 
#include 

int main(void)
{
    char ch[100];
    char s[100];
    int i = 0, j = 0;
    int num = 0;
    
    scanf("%s", ch);
    
    for(i = 0; i < strlen(ch); i++)
    {
        if(ch[i] >= 'a' && ch[i] <= 'z')
        {
            if(ch[i + 1] >= '0' && ch[i + 1] <= '9')
            {
                if(ch[i + 2] >= '0' && ch[i + 2] <= '9')
                {
                    num = (ch[i + 1] - 48) * 10 + (ch[i + 2] - 48);
                }
                else
                    num = ch[i + 1] - 48;
            }
            for(j = 0; j < num ; j++)
            {
                printf("%c", ch[i]);
            }
            
        }
    }

    printf("\n");
    
    return 0;
}

5、字符串排序

輸入一個字符串,然後返回連續最大的字符串

比如demo

1,3,3,3,4,4,4,4,4,0,0,0,4,4,4,4

,此例中由5個連續的4為最大連續子串,返回結果為44444.

1,3,3,3,4,4,4,4,4,0,0,0,0,0,0,5,5,5,5 返回44444;

1,3,3,3,5,5,5,5,5,4,4,4,4,4,0,0,0,0,0,0,4,4,4,4},返回55555;

這是公司OC面試題

【代碼】

#include 

int main(void)
{
    char ch[100];
    int count = 1;
    int i = 0;
    int j = 0;
    int max = 0;
    
    scanf("%[^\n]", ch);
    
    while(ch[i] != '\0')
    {
        if(ch[i] != '0' && ch[i] == ch[i + 2])
        {
            count ++;
        }
        else
        {
            if(count > max)
            {
                max = count;
                j = i;
            }
            count = 1;
        }
        i += 2;
    }

    for(i = 0; i < max; i ++)
    {
        printf("%c", ch[j]);
    }
    printf("\n");
    
    
    return 0;
}

6、查找相同的字串

返回在兩字符串中第一個相同的子串(大於1個字符),並將子串輸出

比如:

輸入

adbAFEHHFS

acwfagAFEf

輸出為

AFE

輸入

qfdgJKlin

qdfgJKwfo

輸出為

gJK

【代碼】

#include 
#include 

int main(void)
{
    char ch1[100] = {};
    char ch2[100] = {};
    int i = 0, j = 0;
    int flag = 0, flag2 = 0;
    
    scanf("%s", ch1);
    getchar();
    scanf("%s", ch2);
    
    while(ch1[i] != '\0')
    {
        for(j = 0; j < strlen(ch2); j++)
        {
            if(ch1[i] == ch2[j] && ch1[i + 1] == ch2[j + 1])
            {
                flag = 1;
                printf("%c", ch1[i]);
                i++;
            }
            else
            {
                if(flag == 1)
                {
                    flag2 = 1;
                    printf("%c", ch1[i]);
                    break;
                }
            }
            
        }
        if(flag2 == 1)
            break;
        i++;
    }
    printf("\n");
    return 0;
}

7、單詞升序排列

輸入一段字符串將單詞升序排列

比如:

輸入 come good goals bad bed

輸出:

bad bed come goals good

輸入 I am Optimus Prime

輸出:

I Optimus Prime am

【代碼】

#include 
#include 

int main(void)
{
    char ch[100] = {};
    int i = 0, j = 0, k = 0;
    
    char *p[10] = {"zhangsan", "lisi", "wangwu"};
    char *temp;
    
    scanf("%[^\n]", ch);
    
    p[0] = ch;
    while(ch[i] != '\0')
    {
        if(ch[i] == ' ')
        {
            j++;
            p[j] = &ch[i + 1];
            ch[i] = '\0';
        }
        i++;
    }

    for(i = 0; i < j; i++)
    {
        for(k = 0; k < j - i; k++)
        {
            if(strcmp(p[k],p[k + 1]) > 0)
            {
                temp = p[k];
                p[k] = p[k + 1];
                p[k + 1] = temp;
            }
        }
    }
    
    for(i = 0; i <= j; i++)
    {
        printf("%s ", p[i]);
    }
    printf("\n");
    
    return 0;
}

8、統計單詞個數

輸入一段字符串,統計其中的單詞個數

比如:

輸入 I like iOS

輸出:

3


輸入 this is Qian Feng College

輸出:

5

【代碼】

#include 
#include 

int main(void)
{
    char str[100] = {}; 
    int i = 0;
    int count = 0;

    scanf("%[^\n]", str);

    char *sep = " ";
    
    char *p[10];
    p[0] = strtok(str, sep);

    while(p[i] != NULL)
    {   
        count ++; 
        printf("%s\n", p[i]);
        p[++i] = strtok(NULL, sep);
    }   
    printf("The number of words is : %d\n", count);

    return 0;
}

9、Objective-C和C++命名之爭

Demo1:

Input:

long_and_mnemonic_identifier

Output:

longAndMnemonicIdentifier


Demo2:

Input:

longAndMnemonicIdentifier

Output:

long_and_mnemonic_identifier


Demo3:

Input:

bad_Style

Output:

Error!

【代碼】

#include 
#include 

int main(void)
{
	char ch[100] = {};
	int i = 0, j = 0;
    
	scanf("%s", ch);
    
	while(ch[i] != '\0')
	{
		if(ch[i] == '_' && (ch[i + 1] >= 97 && ch[i + 1] <= 122))
		{
			for(j = i; ch[j] != '\0'; j++)
			{
				ch[j] = ch[j + 1];
			}
			ch[i] -= 32;
		}
		else if(ch[i] >= 65 && ch[i] <= 90)
		{
			ch[strlen(ch) + 1] = '\0';
			for(j = strlen(ch); j > i; j--)
			{
				ch[j] = ch[j - 1];
			}
			ch[i] = '_';
			ch[i + 1] += 32;
		}
		else if((ch[i] == '_' && (ch[i + 1] >= 65 && ch[i + 1] <= 122)))
		{
			strcpy(ch, "Error!");
		}
		i++;
	}
    
	printf("%s\n", ch);
    
	return 0;
}

10、字符串刪除

輸入一個字符串,然後再輸入兩個數字n 和 m,將這個字符串從第n(從0開始數)個字符開始刪除,刪除m個字符(包含第n個);後面的前移;(注意不要超過字符串范圍)

比如:

輸入:

12345

2

1

輸出為1245

輸入:

abcdefg

3

3

輸出為abcg

輸入

abcd

0

1

輸出為bcd

【代碼】

#include 
#include 

int main(void)
{
	char ch[20] = {};
	int i = 0, j = 0, k = 0;
    
	int n = 0, m = 0;
    
	scanf("%s", ch);
	scanf("%d %d", &n, &m);
    
	while(ch[i] != '\0')
	{
		if(i == n && k < m)
		{
			for(j = i; j < strlen(ch) - 1 - k; j++)
			{
				ch[j] = ch[j + 1];
			}
			k ++;
			i = n - 1 ;
		}
		i++;
	}
	ch[strlen(ch) - m] = '\0';
	
	printf("%s\n", ch);
    
	return 0;
}

11、字符串插入

輸入兩個字符串,然後再輸入一個數字n,將第二個字符串插入到第一個字符串的第n個字符前面(從0開始數);第n個字符(包含第n個)後面的字符後移

比如:

輸入:

hello

world

2

輸出為heworldllo

輸入:

1000

phone

3

輸出為100phone0

輸入

abcd

1234

0

輸出為1234abcd

【代碼】

#include 
#include 

int main(void)
{
    char ch1[50] = {}; 
    char ch2[50] = {}; 
    int num = 0;
    int i = 0, j = 0, k = 0;

    scanf("%s", ch1);
    getchar();
    scanf("%s", ch2);
    scanf("%d", &num);
    
    if(num == strlen(ch1))
    {   
        j = 0,k = 0;
        for(k = strlen(ch1); k < strlen(ch1) + strlen(ch2); k++)
        {   
            ch1[k] = ch2[j ++];
        }    
    }   
    else
    {   
    while(ch1[i] != '\0')
    {   
        if(i == num)
        {   
            for(j = strlen(ch1) + strlen(ch2) - 1; j >= i + strlen(ch2); j --) 
            {
                ch1[j] = ch1[j - (int)strlen(ch2)];
            }
            j = 0;
            for(k = num; k < num + strlen(ch2); k++)
            {
                ch1[k] = ch2[j++];
            }
        }
        else if(num == strlen(ch1))
        {   j = 0,k = 0;
            for(k = strlen(ch1); k < strlen(ch1) + strlen(ch2); k++)
            {
                ch1[k] = ch2[j ++];
            }
        }
        i++;

    }
    }
    ch1[strlen(ch1) + strlen(ch2)] = '\0';

    printf("%s\n", ch1);

    return 0;
}

12、字符串替換

輸入兩個字符串,然後再輸入兩個數字n 和 m,將第一個字符串從第n(從0開始數)個字符開始,數m個字符(包含第n個)替換為第二個字符串;(注意不要超過字符串的范圍)

比如:

輸入:

12345 abcde

1 2

輸出為1abcde45

輸入:

12345 abcde

0

4

輸出為abcde5

輸入

Iloveyou hate

1

4

輸出為Ihateyou

【代碼】

#include 
#include 

int main(void)
{
    char ch1[20] = {};
    char ch2[20] = {};
    int n = 0, m = 0;
    int i = 0, j = 0, k = 0;
    
    scanf("%s", ch1);
    getchar();
    scanf("%s", ch2);
    scanf("%d %d", &n, &m);
    
    //首先判斷替換的位置是否到末尾
    //是,那麼就刪除後面的字符串,直接令尾尾‘\0’,再將替換的字符串添加的末尾
    if(strlen(ch1) == n + m)
    {
        ch1[strlen(ch1) - m] = '\0';//刪除
        for(k = strlen(ch1) ; k < strlen(ch1) + strlen(ch2); k++)
        {
            ch1[k] = ch2[j++];
        }
        ch1[strlen(ch1) + strlen(ch2)] = '\0';
    }
    else
    {//不是
        //那麼就要先刪掉需要替換的那部分字符串,即將後面的往前移動
        while(ch1[i] != '\0')
        {
            if(i == n && k < m)
            {
                for(j = i; j < strlen(ch1) - 1 - k; j++)
                {
                    ch1[j] = ch1[j + 1];
                }
                k ++;
                i = n - 1;
            }
            i++;
        }
        ch1[strlen(ch1) - m] = '\0';
        
        //然後,將替換的字符串插入進來,字符串後移
        i = 0;
        while(ch1[i] != '\0')
        {
            if(i == n)
            {
                for(j = strlen(ch1) + strlen(ch2) - 1; j > i - 1 + strlen(ch2); j--)
                {
                    ch1[j] = ch1[j - strlen(ch2)];
                }
                for(k = 0; k < strlen(ch2); k++)
                {
                    ch1[i + k] = ch2[k];
                }
            }
            i++;
        }
        
        ch1[strlen(ch1) + strlen(ch2)] = '\0';
    }
    printf("%s\n", ch1);
    return 0;
}

13、字符串抽取

輸入兩個字符串,然後輸入一個數字n和數字m,將第一個字符串抽取出從第n(從0開始)個開始數m個字符構成一個新的字符串並輸出,然後把這個新的字符串插入到第二個字符串的第n(從0開始)個字符後輸出(注意不要超過字符串范圍)

比如:

12345 67890

2 1

輸出為673890

輸入:

12345 67890

0 3

輸出為12367890

輸入:

abcde xyz

2

3

輸出為xycdez

【代碼】

#include 
#include 

int main(void)
{
    char ch1[20] = {};
    char ch2[20] = {};
    char str[20] = {};
    int n = 0, m = 0;
    int i = 0, j = 0, k = 0;
    
    scanf("%s", ch1);
    getchar();
    scanf("%s", ch2);
    scanf("%d %d", &n, &m);
    
    //首先抽取字符串,放到另外的字符串數組str中
    while(ch1[i] != '\0')
    {
        if(i == n)
        {
            for(j = n; j < n + m; j++)
            {
                str[k++] = ch1[j];
            }
            str[k] = '\0';
        }
        i++;
    }
    
    //插入
    i = 0, k = 0;
    while(ch2[i] != '\0')
    {
        if(i == n)
        {
            //向右移位
            for(j = strlen(ch2) - 1 + m; j >= i + m; j--)
            {
                ch2[j] = ch2[j - m];
            }
            //插入
            for(j = n; j < n + strlen(str); j++)
            {
                ch2[j] = str[k++];
            }
            ch2[strlen(ch2) + m] = '\0';
        }
        i++;
    }
    
    printf("%s\n", ch2);
    
    return 0;
}

14、字符串交換

從鍵盤輸入五個字符串,把這些字符串地址放入一個指針數組中,然後輸入兩個數n和m(n 和m是數組的下標,所以不要越界),把數組的下標n和下標m進行交換,並且打印數組中的字符串;

比如:

輸入:

I am Optimus Prime lucy

0 1

輸出為

am

I

Optimus

Prime

lucy

輸入:

Hi welcome to qianfeng lilei

2 3

輸出為

Hi

welcome

qianfeng

to

lilei

輸入

abc def ghi jkl heihei

0 4

輸出為

heihei

def

ghi

jkl

abc

【代碼】

#include 
#include 

int main(void)
{
    char str[100] = {};
    int n = 0, m = 0;
    char *sep = " ";
    char *p[10] = {};
    int i = 0, j = 0;
    char *temp = NULL;
    
    scanf("%[^\n]", str);
    scanf("%d %d", &n, &m);
    
    p[0] = strtok(str, sep);
    while(p[i])
    {
        p[++i] = strtok(NULL, sep);
    }
    temp = p[n];
    p[n] = p[m];
    p[m] = temp;
    
    for(j = 0; j < i; j++)
    {
        printf("%s\n", p[j]);
    }
    
    return 0;
}

15、字符串數組查找

輸入五個字符串,然後再輸入一個字符串,打印出最後一個字符串是前五個中第幾個被輸入的(如果出現相同的只打印第一次是第幾個被輸入的)如果不在前五個中則返回-1。

比如:

輸入:

12345 abc def hello

abc

輸出為2

輸入:

abc hello hello world world

hello

輸出為2

輸入

abcde ab cd hello hello

cd

輸出為3

【代碼】

#include 
#include 

int main(void)
{
    char str1[100] = {};
    char str2[20] = {};
    
    scanf("%[^\n]", str1);
    getchar();
    scanf("%[^\n]", str2);
    
    char *sep = " ";
    char *p[10] = {};
    int i = 0, j = 0;
    
    p[0] = strtok(str1, sep);
    while(p[i])
    {
        p[++i] = strtok(NULL, sep);
    }
    for(j = 0; j < i; j++)
    {
        if(strcmp(str2, p[j]) == 0)
        {
            printf("%d\n", j + 1);
            break;
        }
    }
    if(j == i)
    {
        printf("-1\n");
        
    }
    
    return 0;
}

16、字符串拼接

從鍵盤輸入個數不定的字符串(不超過10個),以最後一個字符串整體連接到每兩個字符串之間,組成一個新的字符串,並且輸出這個字符串;

比如:

輸入:

I am Optimus Prime!

:

輸出為

I:am:Optimus:Prime!

輸入:

Hi welcome to qianfeng

#@

輸出為

Hi#@welcome#@to#@qianfeng

輸入

abc def ghi jkl heihei haha mygod

**

輸出為

abc**def**ghi**jkl**heihei**haha**mygod

【代碼】

#include 
#include 

int main(void)
{
    char str[100] = {};
    char ch[10] = {};
    
    scanf("%[^\n]", str);
    getchar();
    scanf("%[^\n]", ch);
    
    char *sep = " ";
    char *p[10] = {};
    int i = 0, j = 0;
    
    p[0] = strtok(str, sep);
    while(p[i])
    {
        p[++i] = strtok(NULL, sep);
    }
    for(j = 0; j < i; j++)
    {
        if(j < i - 1)
        {
            printf("%s", p[j]);
            printf("%s", ch);
        }
        else
        {
            printf("%s", p[j]);
        }
    }
    
    return 0;
}

17、字符串分割

從鍵盤輸入一個字符串,然後再輸入一個字符串,以第二個字符串整體作為分割條件把第一個字符串進行分割,然後輸出分割之後的單詞;

比如:

輸入:

I:am:Optimus:Prime!

:

輸出為

I

am

Optimus

Prime!

輸入:

Hi#@welcome#@to#@qianfeng

#@

輸出為

Hi

welcome

to

qianfeng

輸入

abc@#def@ghi#@jkl

@#

輸出為

abc

def@ghi

jkl

【代碼】

#include 
#include 

int main(void)
{
    char ch[50] = {};
    char str[10] = {};
    char *p[10];
    int i = 0, j = 0, r = 0, k = 0;
    
    scanf("%[^\n]", ch);
    getchar();
    scanf("%[^\n]", str);
    
    p[0] = ch;
    while(ch[i] != '\0')
    {
        r = i;
        for(k = 0; k < strlen(str); k++)
        {
            if(ch[r++] != str[k])
                break;
        }
        if(k == strlen(str))
        {
            p[++j] = &ch[i + strlen(str)];
            ch[i] = '\0';
        }
        i++;
    }
    
    for(i = 0; i <= j; i++)
    {
        printf("%s\n", p[i]);
    }
    
    return 0;
}

18、統計字母在字符串中出現的次數

輸入一串小寫字母(以“.”為結束標志),統計出每個字母在該字符串中出現的次數(若某字母不出現,則不要輸出)。

【代碼】

#include 
#include 

int main(void)
{
    char str[100] = {}; 
    int i = 0, j = 0;
    int count = 0;
    char s = 0;
    
    scanf("%[^.]", str);
    
    for(i = 0; i < strlen(str) - 1; i++)
    {   
        if(str[i] != ' ')
        {   
            s = str[i];
            count = 1;
            for(j = i + 1; j < strlen(str) - 1; j++)
            {   
                if(s == str[j])
                {   
                    count ++; 
                    str[j] = ' ';
                }    
            }   
            printf("%c: %d\n", str[i], count);
        }   
    }   

    return 0;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved