任務描述
本關任務:從后臺輸入任意三個字符串,求最大的字符串。
相關知識
字符串本身是存放在一塊連續的內存空間中,并以’\0’作為字符串的結束標記。
字符指針變量本身是一個變量,用于存放字符串的第 1 個字符的地址。
字符數組是由若干個數組元素組成的,它可用來存放字符串的所有字符。
字符串類型的數據不能像數值型數據一樣進行加減乘除等運算。常見的字符串類型數據的運算有求字符串的長度、字符串的復制、比較兩個字符串的大小、字符串的連接等。
字符串的運算比數值型數據的運算復雜,為減輕編程的負擔,提高效率,C 語言提供了豐富的字符串處理函數來實現字符串的運算,對字符串進行整體操作。
使用字符串處理函數應包含頭文件"string.h",幾種常見運算有:
求字符串長度函數:strlen( )
字符串拷貝函數:strcpy( )
字符串連接函數:strcat( )
字符串比較函數:strcmp( )
求一個字符串的長度
字符串的長度是字符串中所包含的字符個數。例如:"CHINA"的長度是 5,"C program"的長度是 9。
#include<stdio.h>
#include<string.h>
int main()
{
char str[20];
printf(“input string:\n”);
gets(str);
printf(“output string:\n”);
puts(str);
printf(“數組大小=%d\n”,sizeof(str));
printf(“字符串長度=%d\n”,strlen(str));
return 0;
}
運行結果:
input string:
Hubei Huangshi
output string:
Hubei Huangshi
數組大小=20
字符串長度=14
注意區分字符數組的長度和字符串的長度,長度為20的字符數組可以存放長度小于等于19的字符串。
字符串的拷貝
對字符數組只能在定義的同時初始化,不能先定義字符數組,再使用賦值語句為一個字符數組賦值。
char s[15];
s = “C Program”; //編譯錯誤
要將字符串"C Program"存入到數組s中,可以通過調用字符串拷貝函數strcpy()函數來實現。請看示例,從鍵盤輸入兩個字符串,交換后輸出這兩個字符串的值。
#include<stdio.h>
#include<string.h>
int main()
{
char st1[15],st2[15],t[15];
printf(“Please input 2 string:\n”);
gets(st1);
gets(st2);
strcpy(t, st1); //把字符數組st1中的字符串拷貝到t中,串結束標志’\0’也一同拷貝
strcpy(st1,st2); //把字符數組st2中的字符串拷貝到st1
strcpy(st2,t); //把字符數組t中的字符串拷貝到st2
printf(“Now string is:\n”);
puts(st1);
puts(st2);
return 0;
}
運行結果:
Please input 2 string:
Hubei Huangshi
Hubei Wuhan
Now string is:
Hubei Wuhan
Hubei Huangshi
字符串的連接
字符串這種類型的數據經常需要將兩個字符串連接起來,把一個字符串接到另一個字符串的后面,得到一個新字符串。例如:將"Hubei"和"Huangshi"連接,可以得到"HubeiHuangshi"這個新字符串。
請看示例,從鍵盤輸入自己的籍貫和名字,試將它們連接在一起成為一個字符串。
#include<stdio.h>
#include<string.h>
int main( )
{
char str1[30],str2[10];
printf(“Please input 2 string:\n”);
gets(str1);
gets(str2);
strcat(str1,str2);// 把str2中的字符串連接到str1中字符串的后面,新串最后加’\0’
printf(“%s\n”,str1);
return 0;
}
運行結果:
Please input 2 string:
Hubei Huangshi
Zhang San
Hubei HuangshiZhang San
說明:str1必須足夠大,否則不能全部裝入被連接的字符串。
比較兩個字符串的大小
字符串在計算機中是可以比較大小的,字符串比較的規則:就是將兩個字符串自左至右逐個比較對應位置上字符的ASCII碼值,直到出現不同的字符或者達到某個字符串的結尾為止,若全部字符相同,則認為兩個字符串相等;若出現不相同的字符,則以第一對不相同的字符的比較結果為準。
例如: "AC"與"B"比較,因為A的ASCII碼值比B小,那么后面的字符就不再比較了 ,字符串"AC"比字符串"B"小;"computer"與"Computer"比較,因為小寫c的ASCII碼值比大寫C大,所以"computer "比"Computer " 大。
庫函數strcmp(字符串1,字符串2)的功能:按從左向右順序逐個比較兩串字符的ASCII碼,直到遇到不同字符或’\0’為止,函數返回值為int型整數,規則如下:
若字符串1==字符串2,返回零;
若字符串1>字符串2,返回正整數;
若字符串1<字符串2,返回負整數。
注意:對兩個字符串比較,不能用以下形式:
if( str1==str2) printf(“yes”);
而只能用以下語句:
if( strcmp(str1, str2) == 0) printf(“yes”);
編程要求
根據提示,在右側編輯器 Begin-End 區間補充代碼,從后臺獲取任意三個字符串,輸出最大的字符串。
提示:“從鍵盤輸入三個字符串,求最大的字符串”與“從鍵盤輸入三個整數,求最大的整數”兩者算法思想是一致的,只是處理的數據對象不是整數,而是字符串。
測試說明
平臺會對你編寫的代碼進行測試。
測試輸入:
Huangshi
Xiangyang
Wuhan
預期輸出:
Xiangyang
開始你的任務吧,祝你成功!
#include<stdio.h>
#include<string.h>
int main()
{ char st1[15],st2[15],st3[15],max[15];/*****輸入3個字符串*****//********** Begin **********/gets(st1);gets(st2);gets(st3);/********** End **********//*****求3個字符串中的最大字符串*****//********** Begin **********/strcpy(max,st1);if(strcmp(max,st2)<0)strcpy(max,st2);if(strcmp(max,st3)<0)strcpy(max,st3);puts(max);/********** End **********/return 0;
}
非常簡單。