字串表示和字串I O

2022-09-06 08:27:09 字數 3995 閱讀 7529

字串 character string 是以空字元(\o)結尾的char陣列,字串使用的非常廣泛

比如常見的輸入和輸出

#include#define ma "****************"

int main(void)

#define來定義字串常量的,

如果字串檔案中間沒有間隔或者間隔的空格符,ansic會將其串聯起來,比如:

char gre[50]="hello,and"  "how are " "you " "today!";

和char gre[50]="hello ,and how are you today!"; 是相等的

如果想在字串中使用雙引號,可以在雙引號前加乙個反斜線符號,如下所示:

printf("\"run,spot ,run!\" exclaimed dick .\n");

它的輸出如下:

"run ,spot,run!" exclaimed dick.

字串常量屬於靜態儲存(static storage)類 靜態儲存是指如果在乙個函式中使用字串常量,即使是多次呼叫這個函式,該字串在程式的整個執行過程中只儲存乙份。整個引號中的內容作為指向該字串儲存位置的指標。這一點陣列名作為指向陣列儲存位置的指標類似。

#includeint main(void)

%s格式將輸入字串we,%p 格式產生乙個位址,因為如果「are」是個位址,那麼%p應該輸出字串中第乙個字元的位址(ansi之前的現實中實現中可以用%u或者%lu而不是用%p),*"space farers"應該產生所指向的位址中的值,即字串「space farers」的第一字元。

下面是輸出結果:

we,0x004010,s

資料與指標的差別

初始化乙個存在字串的字元陣列和初始化乙個指向字串的指標

char heart="i love tillie"

char *head="i love millie"

主要的差別在於資料名hear是常亮,而head是指標變數,首先它們都可以使用陣列符號

for(i=0;i<6;i++)

putchar(hear[i]);

putchar('\n');

for(i=0;i<6;i++)

putchar(head[i]);

putchar('\n');

執行結果:

i love

i love

其次,兩者都可以使用指標加法:

for(i=0;i<6;i++)

putchar(*(hear+i));

putchar('\n');

for(i=0;i<6;i++)

putchar(*(head+i));

putchar('\n');

執行結果仍然是:

i love

i love

只是只有指標可以使用增量運算子:

while(*(head)!='\0')

putchar(*(head++));

產生如下結果:

i love millie

假定希望head與hear相同,可以這樣做:

head=hear;表示head指向陣列hear

這就使得head指標指向了陣列hear,但是不能:

hear=head;

這情況類似於x=3和3=x;賦值語句的左邊必須是乙個變數或者更一般的說乙個左值value,head=hear 不會使head裡面的millie字串消失,它的功能是改變了head中的儲存位址,但是除非一再別處儲存了millie的地方,否則當hear指向另乙個位址是就沒有辦法訪問這個字串了。

gets()函式:

gets代表get string 函式對於互動式程式非常方便。它從系統的標準輸入裝置(通常是鍵盤)獲得乙個字串。因為字串沒有預定的長度,所以gets()需要知道輸入何時結束。解決辦法是度字串知道遇到乙個換行符(\n),按回車可以產生這個字元。它讀取換行符之前(不包括換行符)的所有字元,在這些字元後新增乙個空字元(\)),然後把字串交給呼叫它的程式。它將去讀換行符並將其丟棄,這樣下次就會在新的一行開始。

#define max 81

char name[max];//分配空間

printf("hi ,what's your name?\n");

gets(name);//把字串放進name中;

printf("nice name,%s.\n",name);

fgets()函式

fgets()函式改進了多處回來的字元簡單的一處道相鄰的記憶體區這個問題,可以指定最大讀入字元數。由於fgets()是為了檔案i\o而設計的。在處理鍵盤輸入是就不如gets()那麼方便。

fgets()和gets()比較:

fgets需要第二個引數來說明最大讀入字元數,如歌這個引數值為n,fgets()就會讀取最多n-1個字元或者讀完乙個換行府為止,這這兩個最先滿足的按個來結束輸入

如果fgets()讀取道換行符,就會把它存到字串裡面,而不是將gets()那樣丟棄

fgets()需要第三個引數來說明讀那個檔案,從鍵盤上讀資料時,可以使用stdin作為該引數,這個識別符號在stdio.h中定義

#include#define max 81

int main(void )

執行後:

hi,what's you name?

butns 

butns

?ah! butns 

問題再付fgets()把換行儲存道字串裡,這樣每次顯示字串時就會顯示換行符。

由於fgets()函式不檢查目標陣列是否能夠容納輸入,所以很不安全。

字串輸出(put  fput printf)

#define de"i am a  #defined string."

int main(void)

const char *str2="a pointer was init to me"

puts("i'm an argument to puts().");

puts(de);

puts(str1);

puts(str2);

puts(&str[5]);

puts(str2+4);

}

執行結果:

i'm an argument to puts().
i am a  #defined string.
an array was init  to me
a pointer was init to me
ray was init  to me
inter was init to me

注意每個字串都是單行顯示,於printf()不同,puts()顯示字串時自動在其後新增乙個換行符。

表示式&str1[5]時陣列str1的第6個元素第位址,這個元素包含字元『r』,它正是puts()輸出字串的起點。

str2+4 指向包含'i',的那個記憶體單元。puts()遇到空字元時他會停下來,所以應該確保空字元存在。

fputs()函式

fputs是gets的面向檔案版本,

fputs與puts區別:

fputs需要第二個引數來說明要寫的檔案,可以使用stdout作為引數來進行輸出顯示,stdio.h定義

與puts不同,fputs並不為輸出自動新增換行符

注意:gets()丟掉輸入裡的換行符,但是puts()為輸出新增換行符,fputs()不為輸出新增換行符,fgets()儲存輸入中換行符。

printf()函式

printf()函式使用起來沒有puts方便,但是它可以格式化多種資料型別,因而更通用

printf("%s\b",string);等同於puts()函式

雖然printf()函式缺乏靈活性,但是,printf("ius are %d, ius =%p ,ius=&p",name ,ms,ms);

表示字串和字串I O

陣列和指標 陣列形式在計算機的記憶體中分配為乙個內涵29個元素的陣列,每個元素都被初始化為字串字面量對應的字元。通常,字串都可以作為課執行檔案的而一部分被儲存在資料段中,當把程式載入記憶體是,也載入了程式中的而字串,字串出存在靜態儲存區,但是程式再開始執行時才會為該陣列分配記憶體。陣列和指標的區別 ...

字串 表示數值的字串

題目描述 實現乙個函式用來判斷字串是否表示數值 包括整數和小數以及使用科學計數法表示的數 分析 表示數值的字串的規則有 第乙個字元只能是 以及數字 數字字元後面只能接 或 e e 小數點後面必須要有字元且只能接數字字元或 e e e e 後面必須要接字元且只能接數字字元或者 後面必須要接數字字元 b...

表示數值的字串(字串)

題目描述 請實現乙個函式用來判斷字串是否表示數值 包括整數和小數 例如,字串 100 5e2 123 3.1416 和 1e 16 都表示數值。但是 12e 1a3.14 1.2.3 5 和 12e 4.3 都不是。思路 1.第乙個數為 或者為 時,跳過。2.對於小數點 小數點只能出現一次 小數點不...