編程學習筆記--對字符串處理的經(jīng)驗與新發(fā)現(xiàn)
字符串方面的只是,用C語言自己已經(jīng)處理了很多了,有點經(jīng)驗了,但是還是有一些新的內(nèi)容,值得關注,比如這里學習發(fā)現(xiàn)的qsort,和bsearch函數(shù),以前不曾用過。
常用的輸入輸出控制方式?
1、數(shù)據(jù)量不定while(scanf(“%d”,&n) != EOF)
2、先給數(shù)據(jù)量scanf(“%d”,&n); while (n--){}
3、以某數(shù)值或符號結束
? ? ? while(scanf(“%d”,&n),n)
1、直接輸出數(shù)據(jù)然后換行
2、每組數(shù)據(jù)后follow一個空行
3、每兩組數(shù)據(jù)之間between一個空行
對于字符串輸入的處理:
C語法:
char buf[20];?
gets(buf);?
C++語法:
如果用string buf;來保存:
getline( cin , buf );?
如果用char buf[ 255 ]; 來保存:
? ? ? ? cin.getline( buf, 255 );
scanf(“ %s%s”,str1,str2),在多個字符串之間用一個或多個空格分隔;
若使用gets函數(shù),應為gets(str1); gets(str2); 字符串之間用回車符作分隔。
通常情況下,接受短字符用scanf函數(shù),接受長字符用gets函數(shù)。
而getchar函數(shù)每次只接受一個字符,經(jīng)常c=getchar()這樣來使用。
getchar():讀入一個字符
? 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;
}??哪里不好?這個函數(shù)執(zhí)行時間和?s?的長度是什么關系?
?strlen?是一個o(N)的函數(shù),每次判斷?i?<?strlen(s)?–?1?都要執(zhí)行,太浪費時間了
字符串內(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
類似的還有查找一個字符出現(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ū)別。單詞一共不超過100行,每個單詞不超過20字符,并查找輸入字符串的位置
#include#include#includechar?Word[5][30];
/**
函數(shù)原型:void?qsort(void?*base,?int?nelem,?int?width,?int(*fcmp)(const?void?*,?const?*))
頭文件:#include是否是標準函數(shù):是
函數(shù)功能:對記錄進行從小到大的快速排序。參數(shù)base指向存放待排序列的數(shù)組的首地址,nelem為數(shù)組中元素的個數(shù),width為每個元素的字節(jié)數(shù),int(*fcmp)(const?void?*,?const?*)為由用戶提供的比較函數(shù)。
返回值:無
*/
/**
函數(shù)原型:void?*bsearch(const?void?*key,?const?void?*base,?size_t?*nelem,?size_t?width,?int(*fcmp)(const?void?*,?const?*))
頭文件:#include是否是標準函數(shù):是
函數(shù)功能:二分法查找。參數(shù)key指向要查找的關鍵字的指針,base指向從小到大的次序存放元素的查找表,nelem指定查找表元素的個數(shù),width指定查找表中每個元素的字節(jié)數(shù),int(*fcmp)(const?void?*,?const?*)為由用戶提供的比較函數(shù)。
返回值:如果沒有找到匹配的值返回0,否則返回匹配項的指針。
*/
int?MyCompare(?const?void?*?e1,?const?void?*?e2?)
{
return?strcmp(?(char?*?)?e1,?(char?*?)?e2?);
}
int?main()
{
int?n?=?0;?//單詞個數(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)??//?‘
