編程學(xué)習(xí)筆記--對(duì)字符串處理的經(jīng)驗(yàn)與新發(fā)現(xiàn)
字符串方面的只是,用C語(yǔ)言自己已經(jīng)處理了很多了,有點(diǎn)經(jīng)驗(yàn)了,但是還是有一些新的內(nèi)容,值得關(guān)注,比如這里學(xué)習(xí)發(fā)現(xiàn)的qsort,和bsearch函數(shù),以前不曾用過(guò)。
常用的輸入輸出控制方式?
1、數(shù)據(jù)量不定while(scanf(“%d”,&n) != EOF)
2、先給數(shù)據(jù)量scanf(“%d”,&n); while (n--){}
3、以某數(shù)值或符號(hào)結(jié)束
? ? ? while(scanf(“%d”,&n),n)
1、直接輸出數(shù)據(jù)然后換行
2、每組數(shù)據(jù)后follow一個(gè)空行
3、每?jī)山M數(shù)據(jù)之間between一個(gè)空行
對(duì)于字符串輸入的處理:
C語(yǔ)法:
char buf[20];?
gets(buf);?
C++語(yǔ)法:
如果用string buf;來(lái)保存:
getline( cin , buf );?
如果用char buf[ 255 ]; 來(lái)保存:
? ? ? ? cin.getline( buf, 255 );
scanf(“ %s%s”,str1,str2),在多個(gè)字符串之間用一個(gè)或多個(gè)空格分隔;
若使用gets函數(shù),應(yīng)為gets(str1); gets(str2); 字符串之間用回車符作分隔。
通常情況下,接受短字符用scanf函數(shù),接受長(zhǎng)字符用gets函數(shù)。
而getchar函數(shù)每次只接受一個(gè)字符,經(jīng)常c=getchar()這樣來(lái)使用。
getchar():讀入一個(gè)字符
? whlie((ch=getchar())!=EOF)
? {
? ? ?
? }
? gets():讀入一行
? while(gets(buf)!=NULL) {
?
? }
案例分析
int?MyStrchr(char?*?s,??char?c)???//看s中是否包含?c
{
for(?int?i?=?0;?i?<?strlen(s)?-1?;?i?++?)
if(?s[i]?==??c)
return?1;
return?0;
}??哪里不好?這個(gè)函數(shù)執(zhí)行時(shí)間和?s?的長(zhǎng)度是什么關(guān)系?
?strlen?是一個(gè)o(N)的函數(shù),每次判斷?i?<?strlen(s)?–?1?都要執(zhí)行,太浪費(fèi)時(shí)間了
字符串內(nèi)元素查找
#include#include/**
char?*strstr(char?*s1,?char?*s2);
Scans?a?string?for?the?occurrence?of?a?given?substring.
查找給定字符串在字符串中第一次出現(xiàn)的位置,返回位置指針
strstr?scans?s1?for?the?first?occurrence?of?the?substring?s2.
Return?Value
strstr?returns?a?pointer?to?the?element?in?s1,?where?s2?begins?(points?to?s2?in?s1).?If?s2?does?not?occur?in?s1,?strstr?returns?null.
如果找到,返回指針,指向s1中第一次出現(xiàn)s2的位置
如果找不到,返回?NULL
類似的還有查找一個(gè)字符出現(xiàn)的位置strchr
*/
char?str[]?=????"lazy";
char?string[]?=?"The?quick?brown?dog?jumps?over?the?lazy?fox";
int?main(?void?)
{
???char?*pdest;
???int??result;
???pdest?=?strstr(?string,?str?);
???result?=?pdest?-?string?+?1;
???if(?pdest?!=?NULL?)
??????printf(?"%s?found?at?position?%dnn",?str,?result?);
???else
??????printf(?"%s?not?foundn",?str?);
}單詞排序
輸入若干行單詞(不含空格),請(qǐng)按字典序排序輸出。大小寫有區(qū)別。單詞一共不超過(guò)100行,每個(gè)單詞不超過(guò)20字符,并查找輸入字符串的位置
#include#include#includechar?Word[5][30];
/**
函數(shù)原型:void?qsort(void?*base,?int?nelem,?int?width,?int(*fcmp)(const?void?*,?const?*))
頭文件:#include是否是標(biāo)準(zhǔn)函數(shù):是
函數(shù)功能:對(duì)記錄進(jìn)行從小到大的快速排序。參數(shù)base指向存放待排序列的數(shù)組的首地址,nelem為數(shù)組中元素的個(gè)數(shù),width為每個(gè)元素的字節(jié)數(shù),int(*fcmp)(const?void?*,?const?*)為由用戶提供的比較函數(shù)。
返回值:無(wú)
*/
/**
函數(shù)原型:void?*bsearch(const?void?*key,?const?void?*base,?size_t?*nelem,?size_t?width,?int(*fcmp)(const?void?*,?const?*))
頭文件:#include是否是標(biāo)準(zhǔn)函數(shù):是
函數(shù)功能:二分法查找。參數(shù)key指向要查找的關(guān)鍵字的指針,base指向從小到大的次序存放元素的查找表,nelem指定查找表元素的個(gè)數(shù),width指定查找表中每個(gè)元素的字節(jié)數(shù),int(*fcmp)(const?void?*,?const?*)為由用戶提供的比較函數(shù)。
返回值:如果沒(méi)有找到匹配的值返回0,否則返回匹配項(xiàng)的指針。
*/
int?MyCompare(?const?void?*?e1,?const?void?*?e2?)
{
return?strcmp(?(char?*?)?e1,?(char?*?)?e2?);
}
int?main()
{
int?n?=?0;?//單詞個(gè)數(shù)
char?obj[20];
char?*search;
while(scanf("%s",Word[n])?!=?EOF?&&?Word[n][0])
n?++;
qsort(Word,?n,sizeof(Word[0]),MyCompare);
int?i;
for(i?=?0;?i?<?n;?i?++?)
printf("%sn",Word[i]);?//?‘n’表示換行
????printf("排序完成,輸入要查找的單詞n");
????gets(obj);
????search=(char*)bsearch(obj,Word,5,sizeof(Word[0]),MyCompare);
????if(search)
????{
????????printf("所查找的位置為:%d",(search-Word[0])/30+1);
????}
return?0;
}字串判斷 判斷s里面的元素是不是都能在t里面找到
#includechar?s[100010];
char?t[100010];
int?main(){
int?i,j;
while?(scanf(?"%s%s",s,t)?>?0?)?{
? i?=?0;
for(j?=?0?;?s[i]?&&?t[j];?j?++?)????????{
if(?t[j]?==?s[i]?)??i?++;
}
if?(?s[i]?==?0)??//?‘
