1. 程式人生 > >第十一章——字串和字串函式

第十一章——字串和字串函式

字串字面值 用雙引號括起來的內容稱為字串字面量,雙引號中的字元和編譯器自動加入末尾的\0字元,都作為字串儲存在記憶體中,如果字串字面量之間沒有間隔,或者用空白字元分隔,C會將其視為串聯起來的字串字面量。字元陣列名和陣列名一樣,指向該陣列的首元素的地址。字串內部想要使用雙引號,在引號前加\

字串陣列初始化 const char ml[10]={‘l’,‘i’,‘z’,‘k’,’\0’} const char ml[10]=“lizk”; 沒有最後的空字元,這就不是一個字串,而是一個字元陣列

陣列形式和指標形式 初始化陣列把靜態儲存區的字串拷貝給陣列,而初始化指標只把字串的地址拷貝給指標 只有指標可以進行遞增操作 因為編譯器可能將相同的字串儲存在同一個地址上,所以如果打算修改字串,就不要用指標指向字串字面量 %s mesg 以字串輸出值 %p &mesg 列印指標的地址 %p mesg輸出指標的值,即儲存的地址

字串輸出 gets()//讀取整行輸入,直到遇到換行符,然後丟棄換行符,儲存其餘字元,並在這些字元末尾新增一個空字元使其成為一個c字串 puts//顯示字串,並在末尾新增換行符,遇到空字元停止輸出 gets(word) puts(word) 這個東西,由於編譯器無法檢查陣列能否裝下字串,可能會導致緩衝區溢位 的問題

fgets()//讀到一個換行符,會把它儲存在字串中 fgets()讀到檔案的結尾,將返回一個空指標,否則,返回的地址與傳入的第一個引數相同 第一個引數,同gets() 第二個引數,指明瞭讀入字元的最大數量 第三個引數,指明要讀入的檔案,鍵盤讀入,則為stdin fputs()//顯示字串,不在後面加換行符 讀取過長輸入沒有問題

空字元和空指標 空字元是用來標記字串末尾的字元,其對應字元編碼是0,為整數型別,佔一個位元組。 空指標的值不會與任何資料的有效地址對應,為指標型別,佔4位元組

gets_s() 只從標準輸入中讀取資料,不需要第三個引數 讀到換行符會丟棄 讀到最大字元都沒有讀取到換行符,會把目標陣列中的首字元設定為空字元,讀取並丟棄隨後的輸入直至讀到換行符或檔案末尾,然後返回空指標。接著呼叫處理函式

s_gets()//自定義函式

//如果字串中出現換行符就用空字元替換,如果字串中出現空
//字元,就丟棄該輸入行的其餘字元,然後返回與fgets()相同的值
char *s_gets(char *st,int n)
{
	char *ret_val;
	int i=0;
	ret_val=fgets(st,n,stdin);
	if (ret_val)
	{
		while(str[i]!='\n'&&st[i]!='\0')
			i++;
		if (str[i]=='\n')
			str[i]='\0';
		else
			while(getchar()!='\n')
				continue;
	}
	return ret_val;
}

字串函式 在 string.h 標頭檔案中 這是一個超連結

sprintf()函式 第一個引數是目標字串的地址,其餘引數和printf()相同 sprintf(formal,"%s,%-19s:$%6.2f\n",last,first,prize); 只不過把組合後的字串儲存在陣列formal中而不是顯示在螢幕上

main()函式 main(void)沒有引數 main(int argc,char *argv[])或者只有兩個引數 第一個引數是命令列中的字串數量 argv[0] 程式本身的名稱 argv[1]隨後的第一個字串 如 輸入 repeat resisitance is futile argv[1]指向repeat argv[2]指向is 等

將字串轉換為數字 atoi()//int atol()//long atof()//double strtol()//long strtoul()//unsigned long strtod()//double 某個栗子 long strtol(const char *restrict nptr,char **restrict endptr,int base); nptr是指向待轉換字串的指標,endptr是一個指標的地址,該指標被設定為標識輸入數字結束字元的地址,base表示以什麼進位制寫入數字