當前位置:首頁 > 芯聞號 > 充電吧
[導讀]字符串方面的只是,用C語言自己已經處理了很多了,有點經驗了,但是還是有一些新的內容,值得關注,比如這里學習發(fā)現的qsort,和bsearch函數,以前不曾用過。常用的輸入輸出控制方式?1、數據量不定w

字符串方面的只是,用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)??//?‘