【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

[email protected]

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

时间: 2024-12-26 13:37:22

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

R语言学习——欧拉计划(11)Largest product in a grid

Problem 11 In the 20×20 grid below, four numbers along a diagonal line have been marked in red. 08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 0849 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 0081 49 31 73 55 79 14 29 93 71 40 67

html学习第三天—— 第11章 盒子模型 div

盒模型--边框(一) 盒子模型的边框就是围绕着内容及补白的线,这条线你可以设置它的粗细.样式和颜色(边框三个属性). 如下面代码为div来设置边框粗细为2px.样式为实心的.颜色为红色的边框: div{ border:2px solid red; } 上面是border代码的缩写形式,可以分开写: div{ border-width:2px; border-style:solid; border-color:red; } 注意: 1.border-style(边框样式)常见样式有: dashed

R语言学习笔记(十六):构建分割点函数

选取预测概率的分割点 cutoff<- function(n,p){ pp<-1 i<-0 while (pp>=0.02) { model.predfu<-rep("failure",n) model.predfu[model4.prob > 0.2 + i*0.001]<-"victory" pp<- abs(p-sum(model.predfu=="failure")/n) i<-i+1

c++primer plus 第11章 编程题第7题

#pragma once #ifndef COMPLEX0_H_ #define COMPLEX0_H_ #include<iostream> class Complex { private: double real; double imgn; public: Complex(); Complex(double a, double b); ~Complex(); Complex operator+(const Complex & a) const; Complex operator-(

C语言学习书籍推荐《C Primer Plus(中文版)(第5版)》下载

普拉塔 (Prata S.) (作者), 云巅工作室 (译者) <C Primer Plus(中文版)(第5版)>共17章,介绍了C语言的基础知识,包括数据类型.格式化输入输出.运算符.表达式.流程控制语句.函数.数组和指针.字符串操作.内存管理.位操作等,知识内容都针对C99标准:另外,<C Primer Plus(中文版)(第5版)>强化了对指针的讨论,并引入了动态内存分配的概念,也讨论了C预处理器和C库函数.高级数据表示(数据结构)方面的内容. 下载地址:点我 编辑推荐 作为

Perl语言学习笔记 11 Perl模块

1.模块来源:随Perl发行版本一起打包.从CPAN下载 2.阅读模块文档:perldoc CGI 3.安装模块 makemaker方式: 指定安装目录: Module::build方式: cpan方式: 4.File::basename模块 5.仅选用模块的部分函数 导入引用列表即可 10.不引入任何函数 通过全名的方式使用: 11.File:Spec模块 12.CGI.pm 13.数据库与DBI DBI:数据库接口(Database Interface) 还需安装对应版本的数据库驱动程序DB

【c语言学习-11】

/*指针*/ #include void charPointFunction(){ //字符型数组 char *x="I like code",y[10];//使x[]初始化,使y[]未初始化 //计数器 int i; x=x+2; //移动数组元素指针 printf("%s",x); //循环 /* for(i=0;*(x+i)!='\0';i++) *(y+i)=*(x+i); *(y+i)='\0'; printf("%s\n",x); f

【C语言学习】《C Primer Plus》第1章 概览

学习总结 1.C语言于1972年由贝尔实验室的Dennis Ritchie在与Ken Thompson一起设计UNIX操作系统的时候开发的.的的设计构想来源于Ken Thompson的B语言.Anyway,它70世纪所需产物,存在即合理. 2.因为UNIX&Linux都是基于C语言开发的,所以,C无所不在:游戏.操作系统.计算机语言.嵌入式.应用…… 3.C实现顺序:源码(.c)→编译器→目标代码(.obj)→链接器(代码库+启动代码)→可执行文件(Linux默认是.out文件,win是.exe

C++ Primer学习总结 第11章 关联容器

第11章 关联容器 1.    使用map的简单例子: 运行结果为: 2.    初始化map和set: 3.    set与multiset的区别: 4.    使用map和set时,其元素类型必须是定义了严格弱序的(即定义了<号比较的),如果元素类型没有定义<号操作也可以通过外部函数来比较: 5.    pair类型:pair是一个用来生成特定类型的模板. pair的默认构造函数对数据成员进行值初始化. 6.    遍历map和set关联容器: 7.    如何往set和map中添加指定元

关于c语言学习 谭浩强的书

2007-11-16 13:22:58|  分类: PROGRAMME |  标签: |举报 |字号大中小 订阅 广大有志于从事IT行业的同志们,在你们进入这一行之前千万请看这篇文章!太经典了!对你绝对有启发! 千万别买谭浩强和等级考试的书!!!!!! 整理别人的言论,请大家踊跃讨论!!!!!!!!!!!! 1:书皮上面有那么多的牛人题词,估计也许是自己的水平太低. 2:ANSI只给了两种方式:int main(void) {/*...*/}和 int main(int argc, char *