【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