學習總結編程
一、字符串(character String)是以空字符串(\o)結尾的char數組。數組
二、gets()方法表明get String,它從系統的標準輸入設備(一般是鍵盤)獲取一個字符串,當字符串遇到換行符(\n)時就結束輸入,丟棄\n符號,而後在字符串後添加空字符(\0)而後把這個字符串交給調用它的程序。Gets方法的構造原型是安全
char *gets(char *s){函數
…學習
If(EOF) return NULL;//僞代碼,說明用spa
…設計
return s;指針
}code
從函數原型能夠看,gets函數的返回值是原指針,當方法遇到文件結尾,字符指針不會讀入字符串,而且返回NULL(空地址)。對象
注:NULL是在stdio.h裏定義的,NULL是一個指針而空字符是一個char類型的數據對象,數值上兩個都爲0,但概念上二者是有所區別:
1 #include <stdio.h> 2 int main(){ 3 char str[20]; 4 char *sp; 5 puts("請輸入隨意字符串:"); 6 sp=gets(str); 7 printf("sp=%p\n",sp); 8 printf("str=%p\n",str); 9 printf("str=%s\n",str); 10 printf("NULL=%d\n",NULL); 11 return 0; 12 }
運行結果:
請輸入隨意字符串:
abc
sp=0x7fffa65013c0
str=0x7fffa65013c0
str=abc
NULL=0
三、因爲gets函數不檢查目標數組是否可以容納輸入,因此很不安全。而fgets函數改進了這個問題,fgets實際上是專門問文件(file)I/O設計的。fgets有三個參數,第一個是一個目標數組,第二個是容許輸入的最大字符數,第三個是輸入源(就是讀取哪一個文件)stdin表明鍵盤輸入(標識在stdio.h),gets函數會把換行符丟棄,而fgets是會保留換行符的。
1 #include <stdio.h> 2 #define MAX 10please input getsData: 3 123456 7890 4 123456 78 5 int main(){ 6 char a[MAX]; 7 char *sp; 8 int n; 9 puts("please input getsData:"); 10 sp = fgets(a,MAX,stdin); 11 printf("%s\n",sp); 12 return 0; 13 }
運行結果:
please input getsData:
123456 7890
123456 78
四、除了gets和fgets能夠處理字符串的讀取,還能夠scanf來讀取字符串,一樣能夠指定讀取長度,scanf函數結束讀取的狀況有兩種,一種是知足長度,另外一種是遇空白字符:
1 #include <stdio.h> 2 #define MAX 10 3 int main(){ 4 char b[MAX]; 5 int n; 6 puts("please input scanfData:"); 7 n = scanf("%10s",b); 8 printf("b has %d char is %s\n",n,b); 9 return 0; 10 }
運行結果1:
please input scanfData:
1234567890123456789
b has 1 char is 1234567890
運行結果2:
please input scanfData:
123 4567890123456789
b has 1 char is 123
五、puts函數是輸出字符串的函數,參數爲字符串參數地址,在字符串後本身添加換行符(\n),當遇到空字符時結束輸出(注:當輸出的是字符數組,而沒有空字符,puts函數一直打印,直到遇到內存有空字符時才結束打印):
1 #include <stdio.h> 2 int main(){ 3 char *p1 = "p1=abcdefg"; 4 char *p2 = "p2=abc\ndefg"; 5 char *p3 = "p3=abcd\0efg"; 6 char p4[] = {'p','4','=','a','b','c','d','e','f','g'}; 7 puts(p1); 8 puts(p2); 9 puts(p3); 10 puts(p4); 11 return 0; 12 }
運行結果:
p1=abcdefg
p2=abc
defg
p3=abcd
p4=abcdefg@
六、fputs是面向文件的一個輸出函數,參數有輸出字符串參數地址和輸出目標,stdout爲標準輸出。由於fgets和fputs是面向文件的,因此不管輸入輸出什麼字符,都是原封不動的,包括換行符(\n)。
七、toupper&ispunct函數練習:
1 #include <stdio.h> 2 #include <string.h> 3 #include <ctype.h> 4 #define LIMIT 80 5 int main(){ 6 char line[LIMIT]; 7 char *p; 8 int ct=0; 9 gets(line); 10 p=line; 11 puts(p); 12 while(*p){ 13 *p = toupper(*p); 14 if(ispunct(*p)) 15 ct++; 16 p++; 17 } 18 puts(line); 19 printf("That line has %d punctuation characters.\n",ct); 20 return 0; 21 }
運行結果:
Me? U talkin' to me? Get outta here!
Me? U talkin' to me? Get outta here!
ME? U TALKIN' TO ME? GET OUTTA HERE!
That line has 4 punctuation characters.
八、編程題(題15)
1 #include <stdio.h> 2 #include <string.h> 3 #define LIMIT 80 4 5 int main(int argc,char *argv[]){ 6 int i; 7 char line[LIMIT]; 8 char *p; 9 char *s; 10 int isGone =1; 11 if(argc > 2){ 12 puts("Just need one param!"); 13 isGone = 0; 14 } 15 16 if(isGone && argc<2){ 17 puts("please enter one param:-u|-l|-p"); 18 isGone = 0; 19 } 20 21 if(isGone){ 22 p = argv[1]; 23 if(strcmp(p,"-u")!=0 && strcmp(p,"-l")!=0 && strcmp(p,"-p")!=0){ 24 puts("error param!"); 25 isGone = 0; 26 } 27 } 28 29 if(isGone){ 30 puts("please enter a line string:"); 31 gets(line); 32 s=line; 33 if(strcmp(p,"-u")==0){ 34 while(*s){ 35 *s=toupper(*s); 36 s++; 37 } 38 } 39 if(strcmp(p,"-l")==0){ 40 while(*s){ 41 *s=tolower(*s); 42 s++; 43 } 44 } 45 } 46 47 if(isGone){ 48 puts(line); 49 } 50 51 return 0; 52 }
運行結果:
./test
please enter one param:-u|-l|-p
./test -p -u
Just need one param!
./test -a
error param!
./test -p
please enter a line string:
abcdefg
abcdefg
./test -u
please enter a line string:
ABCdefg
ABCDEFG
./test -l
please enter a line string:
ABCDefg
abcdefg