【C言語学習】『C Primer Plus』第11章文字列と文字列関数

20307 ワード


***
 
1、文字列(character String)は、空の文字列(o)で終わるchar配列である.
 
2、gets()メソッドはget Stringを表し、システムの標準入力デバイス(通常はキーボード)から文字列を取得し、文字列が改行文字()に遭遇したときに入力を終了し、記号を破棄し、文字列の後に空の文字(0)を追加して呼び出したプログラムに渡す.Getsメソッドの構築原型は
char *gets(char *s){

If(EOF) return NULL;//疑似コード

return s;
}
関数のプロトタイプから、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
",sp); 8 printf("str=%p
",str); 9 printf("str=%s
",str); 10 printf("NULL=%d
",NULL); 11 return 0; 12 }

実行結果:
任意の文字列を入力してください:
abc
sp=0x7fffa65013c0
str=0x7fffa65013c0
str=abc
NULL=0
 
3、gets関数は、ターゲット配列が入力を収容できるかどうかをチェックしないため、安全ではありません.fgets関数はこの問題を改善しましたfgetsは、ファイル(file)I/O設計に特化しています.fgetsには3つのパラメータがあり、1つ目はターゲット配列、2つ目は入力可能な最大文字数、3つ目は入力元(どのファイルを読み込むか)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
",sp); 12 return 0; 13 }

実行結果:
please input getsData:
123456 7890
123456 78
 
4、getsとfgetsは文字列の読み取りを処理することができるほか、scanfは文字列を読み取ることができ、同様に読み取り長を指定することができ、scanf関数が読み取りを終了する場合は2種類あり、1つは長さを満たすことであり、もう1つは空白文字に遭遇することである.
 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,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
 
5、puts関数は文字列を出力する関数で、パラメータは文字列パラメータアドレスで、文字列の後に自分で改行記号()を追加し、空の文字に遭遇したときに出力を終了する(注:出力が文字配列で、空の文字がなく、puts関数は空の文字が存在するまで印刷を終了する):
 1 #include <stdio.h>

 2 int main(){

 3         char *p1 = "p1=abcdefg";

 4         char *p2 = "p2=abc
defg
"; 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@
 
6、fputsはファイル向けの出力関数で、パラメータには出力文字列パラメータアドレスと出力ターゲットがあり、stdoutは標準出力である.fgetsとfputsはファイル向けなので、入力出力にかかわらず改行文字()を含めてそのままです.
 
7、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.
",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.
 
8、プログラミング問題(問題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