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