不需要親自把空字符插入name數組中。scanf在讀取輸入時會替你完成這項任務。也無須在字符串常量中包含一個空字符。
#include<stdio.h> #define PRAISE "What a super marvelous name!" int main (void) { char name[40]; printf("What's your name?\n"); scanf("%s", name); printf("Hello, %s. %s\n", name, PRAISE); return 0; }
當輸入guang yang 的時候的運行結果如下:
scanf() 只讀取了guang yang的名字guang。scanf() 開始讀取輸入以后,會在遇到的第一個空白字符空格(blank)、制表符(tab)或者換行符(newline)處停止讀取。因此他在遇到guang 和yang之間的空格時就停止掃描。一般情況下,使用%s的scanf() 只會把一個單詞而不是把整個句子作為字符串讀入。C使用其他讀取輸入函數(如gets() )來處理一般的字符串。
“X”是字符串常量;屬於派生類型(char數組),實際上由兩個字符(‘X’和空格字符‘\0’)組成。
‘X’是字符常量;屬於基本類型(char)。
sizeof運算符是以字節為單位給出數據的大小。
strlen()函數以字符為單位給出字符串的長度。
空字符‘\0’的存在只是告訴strlen()函數在哪兒停止計數。
#include <stdio.h> #include <string.h> int main(void) { char name[40]; scanf("%s", name); printf("%d\n", strlen(name)); printf("%d\n", sizeof(name)); printf("%d\n", sizeof("guangyang")); return 0; }
運行結果為:
還有一點,sizeof后面是否適用圓括號的問題:
sizeof后面是否使用圓括號取決於你是想獲取一個類型的大小還是想獲取某個具體量的大小。
圓括號對於類型是必需的,而對於具體量則是可選的。
也就是說,應該使用sizeof(char)或sizeof(float),但是可以使用sizeof name或sizeof 6.28.
不過,在所有情況下都使用圓括號更好,比如sizeof (6.18);
#define NAME value
#define 語句也可以用於定義字符和字符串常量。前者用單引號,后者用雙引號。
#define BEEP '\a'
#define TEE 'T'
#define ESC '\033'
#define OOPS "Now you have done it! "
符號名后的所有內容都用來代替它;
格式化輸出中的float:
#include<stdio.h> int main(void) { const double RENT = 3852.99; //以const 方法定義的只讀變量 printf("*%f*\n", RENT); printf("*%e*\n", RENT); printf("*%4.2f*\n", RENT); printf("*%3.1f*\n", RENT); printf("*%10.3f*\n", RENT); printf("*%10.3e*\n", RENT); printf("*%+4.2f*\n", RENT); printf("*%010.2f*\n", RENT); return 0; }
用gcc編譯的結果為:
例中以默認格式%f開始。在這種情況下有兩個默認項目:字段寬度和小數點右邊的數字的數目。第二個默認項目的值是6個數字,字段寬度就是容納數字所用的空間。
接下來是%e的默認格式。它在小數點的左側打印一個數字,在小數點的右側打印打印6個數字。我們得到了一堆數字! 解決方法是指定小數點右邊小數位的數目,上訴例子中接下來的4個示例就是這樣做的。第四個和第六個示例對輸出進行了四舍五入。
最后,+標志使得結果數字和它的代數符號一起打印,在這里該符號就是加號符號;0標志產生前導零以使結果填充整個字段。請注意,在說明符%010中第一個0是一個標志,剩余的數字(10)指定字段寬度。
#include <stdio.h> int main(void) { printf("%x %X %#x\n", 31, 31, 31); printf("**%d**% d**% d**\n", 42, 42, -42); printf("**%5d**%5.3d**%05d**%05.3d**\n", 6, 6, 6, 6); return 0; }
gcc運行結果為:
首先,lf等於13的十六進制數。x說明符輸出lf,而X說明符輸出lF。使用#標志使輸出以0x開始。
第二行示范了如何在說明符中使用空格以在正值之前產生一個前導空格(在負值之前不產生前導空格)。這將使有效位相同的正值和負值以相同字段寬度打印輸出,因此結果看起來會令人舒服一些。
第三行說明如何在整數格式中使用精度說明符(%5.3d)來產生足夠的前導零以填滿要求的最小數字位數(這里是3);而使用0標志將會用前導零填滿整個字段寬度;最后,如果0標志和精度說明符同時出現,那么0標志就會被忽略。
#include<stdio.h> #define BLURB "Authentic imitation" int main(void) { printf("/%2s/\n", BLURB); printf("/%24s/\n", BLURB); printf("/%24.5s/\n", BLURB); printf("/%-24.5s/\n", BLURB); }
gcc運行結果為:
注意系統如何擴展字段以包含所有指定的字符。同時注意:精度說明符是如何限制所打印的字符的數目的。格式說明符中的.5告訴printf()只打印5個字符。另外,“-”修飾符使文本左對齊輸出。