1.
? A)字符串輸入
? 1)gets()函數(shù)讀取整行輸入,直至遇到換行符,然后丟棄換行符,儲(chǔ)存其余字符,并在這些字符的末尾添加一個(gè)空字符使其成為一個(gè)C字符串
? ? 例:
? ? char words[length];
? ? gets(words); //但是如果輸入的字符串長(zhǎng)度大于length,會(huì)導(dǎo)致緩沖區(qū)溢出
? 2)fgets(words,length,stdin<表示從鍵盤輸入>)函數(shù)通過第二個(gè)參數(shù)限制讀入的字符數(shù)來解決溢出問題,如果輸入過多,會(huì)截取length大小的那一段;如果輸入中遇到換行符,會(huì)把它儲(chǔ)存在字符串中
? ? fgets()函數(shù)返回char的指針,如果函數(shù)讀到文件結(jié)尾,他將返回一個(gè)特殊的指針:空指針
? ? fputs(words,stdout)函數(shù)用于顯示輸出,并且不在字符串末尾添加換行符
例:
char words[length];
fgets(words,length,stdin);
fputs(words,stdout);
? 3)gets_s()函數(shù)只從標(biāo)準(zhǔn)輸入中讀取輸入,并在在讀到換行符會(huì)丟棄它而不是存儲(chǔ)它
? 4)s_gets()
? ? 示例代碼:
char * s_gets(char * st,int n)
{
? ? char * ret_val;//最后返回的字符串
int i = 0;
ret_val = fgets(st,n,stdin);
if(ret_val)//即 ret_val!=null
{
? ? while(st[i] != '\n' && st[i] != '\0')
? ? ? i++;
? ? if(st[i] == '\n')
? ? ? st[i] = '\0';//將是換行符的地方變成空字符
? ? else
? ? ? while(getchar() != '\n') //拋棄換行符
? ? ? ? continue;
}
return ret_val;
}
? 5)scanf()函數(shù):更像是“獲取單詞”函數(shù),而不是“獲取字符串”函數(shù)
? B)字符串輸出
? 1)puts()函數(shù)只顯示字符串,而且自動(dòng)在顯示的字符串末尾加上換行符,在遇到空字符時(shí)就停止輸出
? ? 例:puts("hello world.");
? 2)fputs(words,stdout)函數(shù)用于顯示輸出,并且不在字符串末尾添加換行符
例:
char words[length];
fgets(words,length,stdin);
fputs(words,stdout);
? 3)printf()函數(shù)不會(huì)自動(dòng)在每個(gè)字符串末尾加上一個(gè)換行符
2.如果要在字符串內(nèi)部使用雙引號(hào),必須在雙引號(hào)前面加上一個(gè)反斜杠(\)
3.字符串常量屬于靜態(tài)存儲(chǔ)類別,這說明如果在函數(shù)中使用字符串常量,該字符串只會(huì)被儲(chǔ)存一次,在整個(gè)程序的生命期內(nèi)存在,即使
函數(shù)被調(diào)用多次。用雙引號(hào)括起來的內(nèi)容被視為指向該字符串儲(chǔ)存位置的指針。
4.初始化數(shù)組把靜態(tài)存儲(chǔ)區(qū)的字符串拷貝到數(shù)組中,而初始化指針只把字符串的地址拷貝給指針
5.字符串函數(shù)
? 1)strlen()函數(shù)用于統(tǒng)計(jì)字符串的長(zhǎng)度
? 2)strcat()函數(shù)用于拼接字符串
? 3)strncat()函數(shù)指定了最大添加字符數(shù)
? 4)strcmp()函數(shù)用于字符串比較
? 5)strncmp()函數(shù)可以比較到第三個(gè)參數(shù)指定的字符數(shù)
? 6)strcpy()函數(shù)相當(dāng)于是字符串賦值運(yùn)算符
? 7)strncpy()函數(shù)可以指明可拷貝的最大字符數(shù)
? 8)sprintf()函數(shù)把數(shù)據(jù)寫入字符串,而不是打印在顯示器上
6.聲明數(shù)組將分配存儲(chǔ)數(shù)據(jù)的空間,聲明指針只分配儲(chǔ)存一個(gè)地址的空間