1. 程式人生 > >#Cprove 28~31 字元陣列與字串處理

#Cprove 28~31 字元陣列與字串處理

  • no.1 字元統計
  • no.2 刪除指定字元
  • no.3 情書解密
  • no.4 字串處理函式
  • no.5 程式設計處理C++原始碼

NO.1 字元統計

編寫一函式,由實參傳來一個字串,統計此字串中字母、數字、空格和其它字元的個數,在主函式中輸入字串以及輸出上述的結果。

程式碼
#include<stdio.h>
#include<string.h>
#include<ctype.h>
/** 字元統計函式fltj(char str[], int a[])
 *統計str[]中字母、數字、空格及其他字元數目並將結果放入陣列a[]
 * 輸入:str[],a[];
 * 輸出:a[]
 */
void fltj(char str[], int a[]) { int ll,i; ll=strlen(str); //ll賦值為字串長度(真實長度,不含'\0') for (i=0; i<ll; i++) { if (isalpha(str[i])) a[0]++; //統計字母個數 else if (isdigit(str[i])) a[1]++; //統計數字個數 else if (isspace(str[i])) a[2]++; //統計空格數 else a[3]++; }
} int main() { static char str[60]; static int a[4]= {0,0,0,0}; gets(str); fltj(str,a); printf("%s char:%d digit:%d space:%d other:%d",str,a[0],a[1],a[2],a[3]); return 0; }
執行結果

在這裡插入圖片描述

NO.2 刪除指定字元

有一行文字,要求刪去某一個字元。此行文字和要刪去的字元均由鍵盤輸入,要刪去的字元以字元形式輸入(如輸入a表示要刪去所有的 a字元)。

程式碼
#include<stdio.h>
int main() { /*str1表示原來的一行文字,str2表示刪除指定字元後的文字*/ char str1[100],str2[100]; char ch; int i=0,k=0; printf("please input an sentence:\n"); gets(str1); scanf("%c",&ch); for (i=0; str1[i]!='\0'; i++) if (str1[i]!=ch) { str2[k]=str1[i]; k++; } str2[k]='\0'; printf("\n%s\n",str2); return 0; }
執行結果

在這裡插入圖片描述

NO.3 情書解密

背景:小明讓同學傳紙條給小麗。小麗接到會心一笑,大家卻不知所云。紙條上寫著Mpszipsziy,兩人暗中約定是,真實字元為實際字元前面的第4個!Mpszipsziy是神馬意思?推算一下,或從ASCII碼錶中查一下,自然是I love u。 (1)小明請你寫一個程式,在給小麗寫情書時,再不用費功夫自己“翻譯”,原信中每一個字元加密為其後的第4個字元。例,輸入I love u,輸出Mpszipsziy。 (2)小麗請你寫一個程式,在看小明的情書時,讓程式幫著“解密”。因為有同學知道了他們倆人的“加密”手段,決定紙條由人傳,加密數字(1-9)用兩人約好的手勢傳,所以解密時,需要將加密數字作為程式輸入。例,輸入Mpszipsziy(回車)4,輸出I love u (3)小剛常幫著傳紙條,想知道倆人的祕密,但不知道加密數字,於是寫了一個程式,可以列出所有可能的情況。例,輸入Mpszipsziy,多行輸出中必然有一行是I love u。你就是小剛,寫出這個程式來吧。

程式碼一
#include<stdio.h>
#include<string.h>
#define SIZE 20
int main()
{
    char ming[SIZE];
    int i;
    printf("XiaoMing means:\n");
    gets(ming);
    for(i=0;ming[i]!='\0';i++)
        ming[i]+=4;
    printf("XiaoMing says:\n");
    puts(ming);
    return 0;
}
執行結果

在這裡插入圖片描述

程式碼二
#include<stdio.h>
#include<string.h>
#define SIZE 20
int main()
{
    char li[SIZE];
    int i,n;
    printf("XiaoLi receives:\n");
    gets(li);
    printf("Input encrypted number:\n");
    scanf("%d",&n);
    for(i=0;li[i]!='\0';i++)
        li[i]-=n;
    printf("XiaoLi gets:\n");
    puts(li);
    return 0;
}
執行結果

在這裡插入圖片描述

程式碼三
#include<stdio.h>
#include<string.h>
#define SIZE 20
int main()
{
    char li[SIZE],putli[SIZE];	//也可以用putli[SIZE]={'\0'}初始化
    int i,n;
    memset(putli,'\0',SIZE);	//初始化putli[]字元陣列
    printf("XiaoLi receives:\n");
    gets(li);
    do
    {
        printf("Input encrypted number:\n");
        //fflush(stdin);
        scanf("%d",&n);
        for(i=0; li[i]!='\0'; i++)
            putli[i]=li[i]-n;
        putli[i]='\0';
        printf("XiaoLi gets:\n");
        puts(putli);
    }
    while(n!=0);

    return 0;
}
執行結果

在這裡插入圖片描述

小結

如果內迴圈結束沒有putli[i]='\0';,那麼後面會跟著一堆亂碼,從而影響結果。

NO.4 字串處理函式

請編制函式,對字串的進行各種操作。

功能 用陣列名作形參 用指標作形參
1 字串str1和str2連線,連線後的結果存放到str1中 char *astrcat(char str1[], char str2[]) char *pstrcat(char *str1, char *str2)
2 去除字串str中的特定字元c(如空格),結果仍儲存到原字串中 char *adelchar(char str[], char c) char *pdelchar(char *str, char c)
3 求字串str的長度並返回 int astrlen(char str[])
4 統計句子str中單詞的個數 不再重重複,做右邊的(下同) int pwordnum(char *str)
5 去除句子中第一個單詞前的空格,返回去除了空格的字串 char *ptrim(char *str)
6 去除句子中所有多餘的空格,返回去除了空格的字串 char *palltrim(char *str)
7 比較兩個字串,返回值同strcmp() int pstrcmp(const char *str1, const char *str2)
程式碼一:編制字串連線函式
/**< 編制字串連線函式 */
#include <stdio.h>
#include<string.h>
char *astrcat(char *str1, char *str2);
int main()
{
    char s1[50],s2[25];     //不可直接賦值s1[50]="……",否則還要新增指標變數進行操作,因為此時s1[50]被當做常量了
    strcpy(s1,"I am handsome!");
    strcpy(s2,"She is so delicious!");
    puts(s1);
    puts(s2);
    astrcat(s1,s2); //不可寫成s1=astrcat(s1,s2),因為s1是字元陣列不是指標變數,不能直接賦值,但可以寫成下面這樣
    /**<
    char *p1,*p2;
    p1=s1;
    p2=s2;
    p1=astrcat(p1,p2);
    */
    puts(s1);
    return 0;
}

/** char *astrcat(char str1[], char str2[])
 *字串str1和str2連線,連線後的結果存放到str1中
 * input:str1[],str2[]
 * 
 * return:str1[]
 */
char *astrcat(char *str1, char *str2)
{
    int i=0,j=0;
    while(*(str1+i)!='\0')
        i++;
    while(*(str2+j)!='\0')
    {
        *(str1+i)=*(str2+j);
        j++;
        i++;
    }
    *(str1+i)='\0';
    return str1;
}
執行一

在這裡插入圖片描述

程式碼二:字串中刪除指定字元的函式(參見NO.2)
程式碼三:求字串str的長度並返回
/**< 編制求字串str的長度函式 */
#include <stdio.h>
#include<string.h>
int pstrlen(char *str);
int main()
{
    char s[]="The sun shines.";
    puts(s);
    printf("長度為 %d\n",pstrlen(s));
    return 0;
}

/** int pstrlen(char *str)
 *求字串str的長度並返回
 * input:char *str
 * return:int n
 */
int pstrlen(char *str)
{
    int n=0;
    while(str[n]!='\0')
        n++;
    return n;
}
程式碼四:統計句子str中單詞的個數
/**< 編制統計句子str中單詞個數的函式 */
#include <stdio.h>
#include<string.h>
int pwordnum(char *str);
int main()
{
    char s[]="The sun shines.";
    int n;
    n=pwordnum(s);
    puts(s);
    printf("\n單詞數:%d",n);
    return 0;
}

/** int pstrlen(char *str)
 *統計句子str中單詞的個數
 * input:char *str
 * return:int 
 */
int pwordnum(char *str)
{
    int n=0,i=0,word=0; //word作為是否遇到過空格的標誌,遇到置0否則為1
    while(str[i]!='\0')
    {
        if(str[i]==' ')
            word=0;
        else if(word==0)
        {
            n++;
            word=1;
        }
        i++;
    }
    return n;
}
程式碼五:去除句子中第一個單詞前的空格,返回去除了空格的字串
#include <stdio.h>
#include<string.h>
char *ptrim(char *str);
int main()
{
    char s[]="       The sun shines.";
    puts(s);
    puts(ptrim(s));
    return 0;
}

/** char *ptrim(char *str)
 *去除句子中第一個單詞前的空格,返回去除了空格的字串
 * input:char *str
 * return:char *str
 */
char *ptrim(char *str)
{
    int i=0,j=0;
    while(str[i]==' ')
        i++;
    while(str[i]!='\0')
    {
        str[j++]=str[i];
        i++;
    }
    str[j]='\0';
    return str;
}

在這裡插入圖片描述

程式碼六:去除句子中所有多餘的空格,返回去除了空格的字串
#include <stdio.h>
#include<string.h>
char *palltrim(char *str);
int main()
{
    char s[]="       The sun shines.";
    puts(s);
    puts(palltrim(s));
    return 0;
}

/** char *palltrim(char *str)
 *去除句子中所有多餘的空格,返回去除了空格的字串
 * input:char *str
 * return:char *str
 */
char *palltrim(char *str)
{
    int i=0,j=0;
    while(str[i]!='\0')
    {
        if(str[i]!=' ')
        str[j++]=str[i];
        i++;
    }
    str[j]='\0';
    return str;
}

在這裡插入圖片描述

程式碼七:比較兩個字串,返回值同strcmp()
#include <stdio.h>
#include<string.h>
int pstrcmp(const char *str1, const char *str2);
int main()
{
    char s1[]="The sun shines",s2[]="The sun rises";
    puts(s1);
    puts(s2);
    printf("\n比較結果:%d",pstrcmp(s1,s2));
    return 0;
}

/** int pstrcmp(const char *str1, const char *str2)
 *比較兩個字串,返回值同strcmp()
 * input:const char *str1, const char *str2
 * return:int
 */
int pstrcmp(const char *str1, const char *str2)
{
    int i=0,flag=0; //預設兩個字串相等
    while(str1[i]==str2[i]&&(str1[i]!='\0'&&str2[i]!='\0'))
        i++;
    if(str1[i]>str2[i])
        flag=1;
    else if(str1[i]<str2[i])
        flag=-1;
    //if(str1[i]=='\0'&&str2[i]=='\0')
    //    flag=0;
    return flag;
}

在這裡插入圖片描述

NO.5 程式設計處理C++原始碼

(1)讀入一個C程式,判斷其中是否只有一個main()函式,輸出“暫時沒有發現問題”,或者“沒有main()函式”,或者“不能定義多個main()函式”; 提示1:簡單處理,可以只比較判斷“main()”,考慮實際上的各種可能,main後面的括號中還有其他多種寫法。建議按最簡單的情形處理。 提示2:建議設計一個函式,將讀到的程式碼與字串“main()”進行比較。函式用於判斷s1是否“包含”在讀入的一行s2中,呼叫時,形參s1處的實參用“main()”即可,這樣寫提升了“抽象”級別,更容易實現,對應更高的程式碼質量。

程式碼一
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int appear(const char *s1, const char *s2);
int main()
{
    int i;
    char str1[200],str2[]="main()";
    FILE *fp;
    fp=fopen("test.c","r"); //只讀方式開啟
    if(fp==NULL)
    {
        printf("Can not open file!");
        exit(1);    //exit函式包含在stdlib.h中,exit(1)表示異常退出
    }
    //下面此讀取為全部讀取,計算量稍大於後一種
    i=0;
    while(!feof(fp))
    {
        fscanf(fp,"%c",&str1[i]);
        i++;
    }
    str1[i]='\0';	//可不要,因為檔案結束字元即為'\0'
/**< 迴圈讀取還可用fgets函式
    while(!feof(fp))
    {
        fgets(str1,200,fp);     //讀取一行,當讀取 (n-1) 個字元,或者讀取到換行符,或者到達檔案末尾時,它會停止,具體視情況而定。
        num+=appear(str1,str2);
        if(num>1)               //如果str2字串出現超過1次,停止迴圈不必再讀取
            break;
    }
*/
    fclose(fp);
    printf("檔案test.c共 %d 個\"main()\"字串\n",appear(str1,str2));
    return 0;
}

//定義出現次數appear()函式
int appear(const char *s1, const char *s2)
{
    int i=0,k=0,flag=0,count=0;
    while(s1[i]!='\0')
    {
        if(s1[i]==s2[0])    //首字母m對上
        {
            for(k=1;k<6;k++)    //看後面5個字元ain()
            {
                if(s1[i+k]!=s2[k])  //有一個對不上標誌位置0,否則標誌位置1
                {
                    flag=0;
                    break;
                
            
           

相關推薦

#Cprove 28~31 字元陣列字串處理

no.1 字元統計 no.2 刪除指定字元 no.3 情書解密 no.4 字串處理函式 no.5 程式設計處理C++原始碼 NO.1 字元統計 編寫一函式,由實參傳來一個字串,統計此字串中字母、數字、空格和其它字元的個數,在主函式中輸入字串以及輸出

java字元陣列字串相互轉換

1.字串轉化為字元陣列 public class Hello { public static void main(String args[]){ Scanner input = new Scanner(System.in); String str="abc";

C語言字元陣列字串的種種

    #include<stdio.h> #include<string.h> void printByInt(char c[], int count){   

C++字元陣列字串

C/C++語言的特性:靈活;底層;為什麼呢?大概跟陣列和指標這兩個東西有很大的關係; 作為以C++入門的人來說;我覺得有必要去把這門語言搞清楚;當然了這與我的性格有關係; 所以呢,最近會花時間將C++中的一些特性或者之前沒有搞清楚的地方重新梳理一遍;主要面對的是基礎語法方面; 單純的就語

C 字元陣列字串的使用及加結束符'\0'的問題

2、字元陣列與字串在c語言中,將字串作為字元陣列來處理。(c++中不是) 在實際應用中人們關心的是有效字串的長度而不是字元陣列的長度,例如,定義一個字元陣列長度為100,而實際有效字元只有40個,為了測定字串的實際長度,C語言規定了一個“字串結束標誌”,以字元'\0'代表。如果有一個字串,其中第10個字元為'

c語言==字元陣列字串,char的取值範圍(1)

求char型別陣列的strlen長度 昨天老師給了一道題目 #include <stdio.h> #include "string.h" int main() { int i; char a[1000]; fo

c++中字元陣列字串的轉換

1:字元陣列換為字串見程式碼#include <iostream> #include <string> using namespace std; int main(){ char a[10]="aaaabbbba"; string s(&

字元型別char、字串字元陣列字元陣列資料陣列區別

字元型別是以ASCII碼值運算的:小寫字母比相應的大寫字母大32,其中A=65,a=97 Esc鍵 27(十進位制)、'\x1B'(十六進位制)、'\33'(八進位制) 轉義字元:\0 空字元\n 換行\r 回車\t 水平製表符(Tab鍵)\' 單引號\" 雙引號\\ 反斜槓 char c='M';

LeetCode陣列字串-無重複字元的最長子串

無重複字元的最長子串 給定一個字串,找出不含有重複字元的最長子串的長度。 示例 1: 輸入: "abcabcbb" 輸出: 3 解釋: 無重複字元的最長子串是 "abc",其長度為 3。 示例 2: 輸入: "bbbbb" 輸出: 1 解釋: 無重複字元的最

C語言的字元陣列字串)的定義初始化

1、字元陣列的定義與初始化 字元陣列的初始化,最容易理解的方式就是逐個字元賦給陣列中各元素。 char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y'}; 即把10個字元分別賦給str[0]到str[9]10個元素 如果花

陣列字串字元指標其他型別指標、賦值引數、指標引數以及引用引數、函式指標

◆陣列和字串 從表面上看,一個字串就是一個字元陣列,但在C++語句中,兩者並不完全相同。 字串是一個以串尾符"\0"結尾的字元型陣列,但任一個字元型陣列不見得必為字串(因為其中可以不包含"\0"結尾字元)。 char string1[7]="China";char string2[]="China";ch

字元字元陣列字串指向字串的指標

今天在寫一個簡單的面向連線的TCP Socket程式時(UNIX Network Programming上的時間伺服器和客戶端例子)。有個簡單的改變是將從伺服器返回的日期字串 改成一個字元一個字元的返回。 修改之前是這樣子的: // ticks = time(NULL);

Ruby--陣列字串轉換及去重

1 字串轉陣列 split(",") #字串a a = "12,34,56" #陣列a a = a.split(",") #a = ["12","34","56"] 2 陣列轉成字串 join(",") #陣列 a = ["12","34

字元字串字元陣列字串指標變數

字元和字串的區別 字元 如下,定義char,每一個字元一般情況下佔用8個位元組。 char c, ch; 字串 例如"helloworld"; 注意' '和" "的區別,後者為常量字串 在C++中,有兩種型別的字串表示形式: C-風格字

java新手:字串陣列字元陣列字串之間的轉換

(1)字串和字元陣列的轉化 // 字串轉化成字元陣列 String str = "abcdefg"; char[] ch = str.toCharArray(); //輸出a System.out.println(ch[0]); //字元陣列

C++中字元陣列string的相互轉換

字元陣列轉化成string型別 char ch [] = “ABCDEFG”; string str(ch);//也可string str = ch; 或者 char ch [] = “ABCDEFG”; string str; str = ch;//在原有基

java之字元陣列字串、整形之間的轉換。

轉自https://www.cnblogs.com/javacatalina/p/6641338.html 一、字元陣列轉字串 方法1 char[] str = {'a','b','d'}; StringBuffer sb = new StringBugger

js陣列字串的相互轉換

一、陣列轉字串 需要將陣列元素用某個字元連線成字串,示例程式碼如下: var a, b,c; a = new Array(a,b,c,d,e); b = a.join('-'); //a-b-c-d-e 使用-拼接陣列元素 c = a.join(''); //abc

numpy陣列字串的轉換

陣列與字串的轉換 tostring 方法 轉化為字串: 我們可以使用不同的順序來轉換字串: 這裡使用了Fortran的格式,按照列來讀資料。 fromstring 函式 可以使用 fromstring 函式從字串中讀出資料,不過要指定型別: 此時

c#位元組陣列字串轉換

    總結歸納:如果直接從System.String類中找到方法進行字串和位元組陣列之間的轉換,是不太可能的。為了使其之間進行轉換,需要藉助另外一個型別:System.Text.Encoding。這個型別提供了將C#字串轉換成位元組陣列的方法,也提供了將C# 位元組陣列轉換成字