1. 程式人生 > >《明解C語言》示例程式碼和練習程式碼[第9章]

《明解C語言》示例程式碼和練習程式碼[第9章]

第9章 字串的基本認識


示例程式碼:


示例程式碼9-1

/*
    顯示字串字面長度 
*/

#include <stdio.h>

int main(void)
{
    printf("sizeof(\"123\")        = %u\n",        (unsigned)sizeof("123"));
    printf("sizeof(\"AB\\tC\")      = %u\n",        (unsigned)sizeof("AB\tC"));
    printf("sizeof(\"abc\\0def\")   = %u\n",        (unsigned)sizeof("abc\0def"));
    
    return (0);    
}

示例程式碼9-2

/*
    儲存字串的陣列 
*/

#include <stdio.h>

int main(void)
{
    char str[4];        //儲存字串的陣列
    
    str[0] = 'A';       // 賦值
    str[1] = 'B';       // 賦值
    str[2] = 'C';       // 賦值
    str[3] = '\0';      // 賦值
    
    printf("字串str為%s。\n", str);        // 顯示
    
    return(0);  
}

示例程式碼9-3

/*
    儲存字串的陣列(初始化) 
*/

#include <stdio.h>

int main(void)
{
    char str[] = "ABC";        //初始化    
    
    printf("字串str為%s。\n", str);        // 顯示
    
    return (0); 
}

示例程式碼9-4

/*
    詢問名字並顯示問候語(讀取字串) 
*/

#include <stdio.h>

int main(void)
{
    char name[40];
    
    printf("請輸入您的名字:");
    scanf("%s", name);
    
    printf("您好, %s 先生/女士!!\n", name);    
    
    return (0);
}

示例程式碼9-5

/*
    格式化字串“12345”並顯示 
*/

#include <stdio.h>

int main(void)
{
    char str[] = "12345";
    
    printf("%s\n",    str);        // 原樣輸出
    printf("%3s\n",   str);        // 至少顯示3位 
    printf("%.3s\n",  str);        // 最多顯示3位 
    printf("%8s\n",   str);        // 右對齊 
    printf("%-8s\n",  str);        // 左對齊
    
    return (0);   
}

示例程式碼9-6

/*
    字串陣列 
*/

#include <stdio.h>

int main(void)
{
    int i;
    char cs[][6] = {"Turbo", "NA", "DOHC"};
    
    for (i = 0; i < 3; i++)
        printf("cs[%d] = \"%s\"\n", i, cs[i]);  
        
    return (0);
}

示例程式碼9-7

/*
    讀取並顯示字串陣列 
*/

#include <stdio.h>

int main(void)
{
    int i;
    char cs[3][128];
    
    for (i = 0; i < 3; i++) {
        printf("cs[%d]: ", i);
        scanf("%s", cs[i]);
    }    
    
    for (i = 0; i < 3; i++)
        printf("cs[%d] = \"%s\"\n", i, cs[i]);
        
    return (0);
}

示例程式碼9-8

/*
    判斷字串的長度 
*/

#include <stdio.h>

// 返回字串str的長度
unsigned str_length(const char str[])
{
    unsigned len = 0;
    
    while (str[len])
        len++;
     
    return (len);        
} 

int main(void)
{
    char st[100];
    
    printf("請輸入字串:");
    scanf("%s", st);
    
    printf("字串%s的長度為%u。\n", st, str_length(st));
    
    return (0);   
}

示例程式碼9-9

/*
    依次顯示字串中的字元 
*/

#include <stdio.h>

// 顯示字串(不換行)
void put_string(const char str[])
{
     unsigned i = 0;
     
     while (str[i])
         putchar(str[i++]);
} 

int main(void)
{
    char str[100];
    
    printf("請輸入字串:");
    scanf("%s", str);
    
    put_string(str);
    putchar('\n');
    
    return (0);    
}

示例程式碼9-10

/*
    計算字串中的數字字元數 
*/

#include <stdio.h>

// 將字串str中的數字字元儲存至陣列cnt
void str_dcount(const char str[], int cnt[]) 
{
    unsigned i = 0;
    while (str[i]) {
        if (str[i]) {
            if (str[i] >= '0' && str[i] <= '9')
                cnt[str[i] - '0']++;
            i++;
        }
    }     
}

int main(void)
{
    int i;
    int dcnt[10] = {0};
    char str[100];
    
    printf("請輸入字串:");
    scanf("%s", str);
    
    str_dcount(str, dcnt);
    
    puts("數字字元的出現次數");
    for (i = 0; i < 10; i++)
        printf("'%d' : %d\n", i, dcnt[i]);
    
    return (0);    
}

示例程式碼9-11

/*
    字串陣列 (函式版)
*/

#include <stdio.h>

// 顯示字串陣列
void put_strary(const char st[][6], int n)
{
    int i;
    for (i = 0; i < n; i++)
        printf("st[%d] = \"%s\"\n", i, st[i]);     
} 

int main(void)
{
    char cs[][6] = {"Turbo", "NA", "DOHC"};
    
    put_strary(cs, 3);  
        
    return (0);
}

示例程式碼9-12

/*
    顯示字串陣列 
*/ 

#include <stdio.h>

// 顯示字串陣列(逐個顯示字元)
void put_strary2(const char st[][6], int n)
{
    int i;
    
    for (i = 0; i < n; i++) {
    	int j = 0;
    	printf("st[%d] = \"", i);
    	
    	while (st[i][j])
    	    putchar(st[i][j++]);
    	    
    	puts("\"");
	}
} 

int main(void)
{
    char cs[][6] = {"Turbo", "NA","DOHC"};
	 
	put_strary2(cs, 3);
	
	return (0);
} 

示例程式碼9-13

/*
    對字串的英文字元進行大小寫轉換 
*/

#include <ctype.h>
#include <stdio.h>

// 將字串中的英文字元轉換為大寫字母
void str_toupper(char str[])
{
    unsigned i = 0;
	while (str[i]) {
		str[i] = toupper(str[i]);
		i++;
	}	
} 

// 將字串中的英文字元轉換為小寫字母
void str_tolower(char str[])
{
    unsigned i = 0;
	while (str[i]) {
		str[i] = tolower(str[i]);
		i++;
	}	
}

int main(void)
{
	char str[100];
	
	printf("請輸入字串:");
	scanf("%s", str);
	
	str_toupper(str);
	printf("大寫字母:%s\n", str);
	
	str_tolower(str);
	printf("小寫字母:%s\n", str);
	return (0);
}


練習程式碼:


練習程式碼e9-1

/*
    儲存字串的陣列(初始化) 
*/

#include <stdio.h>

int main(void)
{
    char str[] = "ABC\0DEF";                  //初始化    
    
    printf("字串str為%s。\n", str);        // 顯示
    
    return (0); 
}

練習程式碼e9-2

/*
    將str變成空字串 
*/

#include <stdio.h>

int main(void)
{
    char str[] = "ABC";
    
    str[0] = '\0';
    
    printf("字串str為%s。\n", str);
    
    system("pause");
    return (0);    
}

練習程式碼e9-3

/*
    編寫如下函式,若字串str中含有字元c(若含有多個,以先出現的為準),
    則返回該元素的下標值,否則返回-1 
*/

#include <stdio.h>

int str_char(const char str[], int c)
{
    int i = 0;
    while (str[i]) {
        if (c == str[i])
            break;
        i++;
    }
    
    if (!str[i])    i = -1;
            
    return (i);
}

int main(void)
{
    char st[10];
    char ch;
    int pos;
    
    printf("請輸入字串:");
    scanf("%s", st);
    
    getchar();        // 清除快取 
    
    printf("\n請輸入要查詢的字元:");
    scanf("%c", &ch);
      
    pos = str_char(st, ch); 
    
    if (-1 == pos)
        printf("\n在字串%s中未出現字元%c。\n", st, ch);
    else
        printf("\n在字串%s中字元%c首次出現在第%d位。\n", st, ch, pos + 1);
        
    return (0);
}

練習程式碼e9-4

/*
    編寫如下函式,
    返回字串str中字元c的個數(沒有則返回0) 。 
*/

#include <stdio.h>

int str_chnum(const char str[], int c)
{
    int num = 0;
    int len = 0;
    
    while (str[len])
        if (c == str[len++])    num++;   

    return (num);
}

int main(void)
{
    char st[10];
    char ch;
    
    printf("請輸入字串:");
    scanf("%s", st);
    
    getchar();        // 清除快取 
    
    printf("\n請輸入要查詢的字元:");
    scanf("%c", &ch);
    
    printf("\n在字串%s中字元%c出現了%d次。\n", st, ch, str_chnum(st, ch));

    return (0);
}

練習程式碼e9-5

/*
    依次顯示字串中的字元 
*/

#include <stdio.h>

// 顯示字串(不換行)
void put_string(const char str[])
{
     unsigned i = 0;
     
     while (str[i])
         printf("%c", str[i++]);
} 

int main(void)
{
    char str[100];
    
    printf("請輸入字串:");
    scanf("%s", str);
    
    put_string(str);
    putchar('\n');
    
    return (0);    
}

練習程式碼e9-6

/*
    編寫如下函式,使字串str顯示no次。 
    void put_stringn(const char str[], int no) {}
*/

#include <stdio.h>

void put_stringn(const char str[], int no)
{
    while (no--)
        puts(str);     
}

int main(void)
{
    char str[100];
    int n;
    
    printf("請輸入字串:");
    scanf("%s", str);
    
    printf("請輸入重複次數:");
    scanf("%d", &n);
    
    put_stringn(str, n);
    putchar('\n');
    
    return (0);    
}

練習程式碼e9-7

/*
    編寫put_rstring函式,實現字串的逆向輸出。 
*/

#include<stdio.h>

void  put_rstring(const char str[])
{
    int i = 0;
    
    while (str[i])
        i++;
    
    while (i + 1) {
        putchar(str[i]);
        i--;
    }      
}

int main(void)
{
    char str[100];
    
    printf("請輸入字串:");
    scanf("%s", str);
    
    printf("\n輸入字串的逆向是:");
    put_rstring(str);
    
    putchar('\n');
    
    return (0);    
}

練習程式碼e9-8

/*
    編寫如下函式,實現字串str的逆向儲存。
    void rev_string(char str[]) {} 
*/

#include <stdio.h>

void rev_string(char str[])
{
    int n = 0;
    int i;
    char t;
    
    while (str[n])    n++;
    
    n--;
    
    for (i = 0; i < n / 2; i++) {
        t = str[i];     
        str[i] = str[n - i];
        str[n - i] = t;
    }
}

int main(void)
{
    char str[100];
    
    printf("請輸入字串:");
    scanf("%s", str);
    
    printf("\n字串現在的順序是:%s", str);
    
    rev_string(str);
     
    printf("\n字串現在的順序是:%s\n", str);
    
    return (0); 
}

練習程式碼e9-9

/*
    編寫如下函式,將字串str轉換為空字串。
	void null_string(char str[]) {} 
*/

#include <stdio.h>

// 將字串str轉換為空字串
void null_string(char str[])
{
	str[0] = '\0';
}

int main(void)
{
	
	char str[100];
	
	printf("請輸入字串:");
	scanf("%s", str);
	
	printf("\n字串是:%s\n", str);
	
	null_string(str);
		
	printf("轉換為空字串後:%s\n", str);
	
	return (0); 
}

練習程式碼e9-10

/*
    編寫如下函式,將字串str中的數字字元全部刪除。
	void del_digit(char str[]) {} 
*/

#include <stdio.h>

// 將字串str中的數字字元全部刪除
void del_digit(char str[])
{
    unsigned i = 0;
    unsigned j;
    
    while (str[i])  {
    	if (str[i] >= '0' && str[i] <= '9') {
		    j = i; 
    	    while (str[j]) {
    	        str[j] = str[j + 1];
    	        j++;
			}  
			i--;   
    	} 
    	i++;
	}
} 

int main(void)
{
	char str[100];
	
	printf("請輸入字串:");
	scanf("%s", str);
	
	printf("\n字串是:%s\n", str);
	
	del_digit(str);
		
	printf("刪除數字後的字串是:%s\n", str);
	return (0);
}