zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    使用某些 DOCTYPE 时会导致 document.body.scrollTop 失效
    VB.NET 笔记1
    知识管理系统Data Solution研发日记之一 场景设计与需求列出
    知识管理系统Data Solution研发日记之五 网页下载,转换,导入
    折腾了这么多年的.NET开发,也只学会了这么几招 软件开发不是生活的全部,但是好的生活全靠它了
    分享制作精良的知识管理系统 博客园博客备份程序 Site Rebuild
    知识管理系统Data Solution研发日记之四 片段式数据解决方案
    知识管理系统Data Solution研发日记之二 应用程序系列
    知识管理系统Data Solution研发日记之七 源代码与解决方案
    知识管理系统Data Solution研发日记之三 文档解决方案
  • 原文地址:https://www.cnblogs.com/wcd144140/p/4662521.html
Copyright © 2011-2022 走看看