【C语言学习】《C Primer Plus》第11章 字符串和字符串函数

 

学习总结

 

1、字符串(character String)是以空字符串(\o)结尾的char数组。

 

2、gets()方法代表get String,它从系统的标准输入设备(通常是键盘)获取一个字符串,当字符串遇到换行符(\n)时就结束输入,丢弃\n符号,然后在字符串后添加空字符(\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\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

 

3、由于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

 

4、除了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

 

5、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@

 

6、fputs是面向文件的一个输出函数,参数有输出字符串参数地址和输出目标,stdout为标准输出。因为fgets和fputs是面向文件的,所以无论输入输出什么字符,都是原封不动的,包括换行符(\n)。

 

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.\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.

 

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

posted @ 2015-07-20 20:06  wc的一些事一些情  阅读(253)  评论(0编辑  收藏  举报