【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