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


    学习总结

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

     

    2、gets()方法代表get String,它从系统的标准输入设备(通常是键盘)获取一个字符串,当字符串遇到换行符( )时就结束输入,丢弃 符号,然后在字符串后添加空字符()然后把这个字符串交给调用它的程序。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有三个参数,第一个是一个目标数组,第二个是允许输入的最大字符数,第三个是输入源(就是读取哪个文件)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函数结束读取的情况有两种,一种是满足长度,另一种是遇空白字符:

     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=abcdefg";
     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

  • 相关阅读:
    jQuery---自定义动画 animate();
    jQuery---清空节点和删除节点
    HTML5与HTML4的区别
    前端开发CSS清除浮动的方法有哪些?
    关于为什么使用React新特性Hook的一些实践与浅见
    js 设计模式:观察者和发布订阅模式
    easyUI dataGrid主从表点击展开问题
    正则表达式
    JS高级---拷贝继承:把一个对象中的属性或者方法直接复制到另一个对象中
    vue-element-admin框架快速入门
  • 原文地址:https://www.cnblogs.com/wcd144140/p/4662521.html
Copyright © 2020-2023  润新知