学习总结

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,但概念上两者是有所区别:

 #include <stdio.h>
int main(){
char str[];
char *sp;
puts("请输入随意字符串:");
sp=gets(str);
printf("sp=%p\n",sp);
printf("str=%p\n",str);
printf("str=%s\n",str);
printf("NULL=%d\n",NULL);
return ;
}

运行结果:

请输入随意字符串:

abc

sp=0x7fffa65013c0

str=0x7fffa65013c0

str=abc

NULL=0

3、由于gets函数不检查目标数组是否能够容纳输入,所以很不安全。而fgets函数改进了这个问题,fgets其实是专门问文件(file)I/O设计的。fgets有三个参数,第一个是一个目标数组,第二个是允许输入的最大字符数,第三个是输入源(就是读取哪个文件)stdin代表键盘输入(标识在stdio.h),gets函数会把换行符丢弃,而fgets是会保留换行符的。

 #include <stdio.h>
#define MAX 10please input getsData: int main(){
char a[MAX];
char *sp;
int n;
puts("please input getsData:");
sp = fgets(a,MAX,stdin);
printf("%s\n",sp);
return ;
}

运行结果:

please input getsData:

123456 7890

123456 78

4、除了gets和fgets可以处理字符串的读取,还可以scanf来读取字符串,同样可以指定读取长度,scanf函数结束读取的情况有两种,一种是满足长度,另一种是遇空白字符:

 #include <stdio.h>
#define MAX 10
int main(){
char b[MAX];
int n;
puts("please input scanfData:");
n = scanf("%10s",b);
printf("b has %d char is %s\n",n,b);
return ;
}

运行结果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函数一直打印,直到遇到内存有空字符时才结束打印):

 #include <stdio.h>
int main(){
char *p1 = "p1=abcdefg";
char *p2 = "p2=abc\ndefg";
char *p3 = "p3=abcd\0efg";
char p4[] = {'p','','=','a','b','c','d','e','f','g'};
puts(p1);
puts(p2);
puts(p3);
puts(p4);
return ;
}

运行结果:

p1=abcdefg

p2=abc

defg

p3=abcd

p4=abcdefg@

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

7、toupper&ispunct函数练习:

 #include <stdio.h>
#include <string.h>
#include <ctype.h>
#define LIMIT 80
int main(){
char line[LIMIT];
char *p;
int ct=;
gets(line);
p=line;
puts(p);
while(*p){
*p = toupper(*p);
if(ispunct(*p))
ct++;
p++;
}
puts(line);
printf("That line has %d punctuation characters.\n",ct);
return ;
}

运行结果:

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)

 #include <stdio.h>
#include <string.h>
#define LIMIT 80 int main(int argc,char *argv[]){
int i;
char line[LIMIT];
char *p;
char *s;
int isGone =;
if(argc > ){
puts("Just need one param!");
isGone = ;
} if(isGone && argc<){
puts("please enter one param:-u|-l|-p");
isGone = ;
} if(isGone){
p = argv[];
if(strcmp(p,"-u")!= && strcmp(p,"-l")!= && strcmp(p,"-p")!=){
puts("error param!");
isGone = ;
}
} if(isGone){
puts("please enter a line string:");
gets(line);
s=line;
if(strcmp(p,"-u")==){
while(*s){
*s=toupper(*s);
s++;
}
}
if(strcmp(p,"-l")==){
while(*s){
*s=tolower(*s);
s++;
}
}
} if(isGone){
puts(line);
} return ;
}

运行结果:

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

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

  1. 12天学好C语言——记录我的C语言学习之路(Day 11)

    12天学好C语言--记录我的C语言学习之路 Day 11: 因为指针部分比较的难,所以我们花费的时间也是最长的,希望大家耐的住性子,多多理解,多多打代码.好了,废话不多说,来看第11天的学习. //编 ...

  2. c语言学习之基础知识点介绍(十一):字符串的介绍、使用

    本节主要介绍c语言中的字符串的应用. 一:字符串介绍 因为c语言中没有像Java.C#那样的字符串类型,所以无法直接用字符串.需要借助数组来解决这个问题. /* 定义:把多个字符连在一起就叫字符串.但 ...

  3. 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 0 ...

  4. 《C++ primer》--第11章

    习题11.1 algorithm头文件定义了一个count的函数,其功能类似于find.这个函数使用一对迭代器和一个值做参数,返回这个值出现次数的统计结果.编写程序读取一系列int型数据,并将它们存储 ...

  5. c语言学习之基础知识点介绍(三):scanf函数

    本节继续介绍c语言的基础知识点. scanf函数:用来接收用户输入的数据. 语法:scanf("格式化控制符",地址列表); 取地址要用到取地址符:&(shift+7) 例 ...

  6. C++ Primer 5th 第11章 关联容器

    练习11.1:描述map 和 vector 的不同. map是关联容器,vector是顺序容器,关联容器与值无关,vector则与值密切相关 练习11.2:分别给出最适合使用 list.vector. ...

  7. [C++ Primer Plus] 第11章、使用类(一)程序清单——重载 P408

    程序清单11.4~11.6(运算符重载——添加加法运算符) //1.h class Time { private: int hours; int minutes; public: Time(); Ti ...

  8. R语言学习笔记:choose、factorial、combn排列组合函数

    一.总结 组合数:choose(n,k) —— 从n个中选出k个 阶乘:factorial(k) —— k! 排列数:choose(n,k) * factorial(k) 幂:^ 余数:%% 整数商: ...

  9. C语言学习之我见-malloc和free内存申请及释放函数

    malloc函数负责向计算机申请确定大小的内存空间. free函数负责释放malloc的申请空间. (1)函数原型 void free(void *_Memory); void * malloc(si ...

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

    盒模型--边框(一) 盒子模型的边框就是围绕着内容及补白的线,这条线你可以设置它的粗细.样式和颜色(边框三个属性). 如下面代码为div来设置边框粗细为2px.样式为实心的.颜色为红色的边框: div ...

随机推荐

  1. python logging模块可能会令人困惑的地方

    python logging模块主要是python提供的通用日志系统,使用的方法其实挺简单的,这块就不多介绍.下面主要会讲到在使用python logging模块的时候,涉及到多个python文件的调 ...

  2. HTML5 CSS3学习

    HTML5 CSS3学习 :http://www.1000zhu.com/course/css3/ HTML5 相关书籍:   http://www.html5cn.com.cn/news/gdt/2 ...

  3. SDN三种模型解析

    数十年前,计算机科学家兼网络作家Andrew S. Tanenbaum讽刺标准过多难以选择,当然现在也是如此,比如软件定义网络模型的数量也很多.但是在考虑部署软件定义网络(SDN)或者试点之前,首先需 ...

  4. 使用spring的特殊bean完成配置

    1.分散配置 beans.xml配置如下: 使用占位符变量代替bean装配文件中的硬编码配置.占位符采用${variable}形式. 说明:当通过context:property-placeholde ...

  5. checkbox标签已有checked=checked属性但是不显示勾选

    点击全选按钮,选中下面的列表,再次点击取消选择. 第一次的使用的方法是$("input[name=xxx]").attr('checked',true); 但是往往刷新页面第一次点 ...

  6. php中的抽象类(abstract class)和接口(interface)

    一. 抽象类abstract class 1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类. 2 ...

  7. 13.Xcode开发的快捷键

    1.文件 CMD + N: 新文件: CMD + SHIFT + N: 新项目: CMD + O: 打开: CMD + S: 保存: CMD + SHIFT + S: 另存为: CMD + W: 关闭 ...

  8. MFC修改初始窗口大小和窗口名字禁止窗口最大,最小化

    2,在里面就可以修改初始窗口大小和窗口名字 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs){if( !CFrameWnd::PreCrea ...

  9. 蓄水池算法(Reservoir Sampling)

    蓄水池算法是一种随机算法,可以形象的描述为从一个n维的list中选取k个元素,其中n是一个很大的数或者n是一个未知的数,而且一般n很大使得不会将list存在主存中. 解法: i = 0 while m ...

  10. 【洛谷P3197】越狱

    本来还想了一会dp-- 然而一看数据范围明显是数论-- 那么推一推.. 我们发现可以用总方案数减去不会越狱的方案数 那么我们考虑在长度为n的数列中填数 首先第一个位置有m种选择,后面的位置: 总方案: ...