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

  • 相关阅读:
    现代软件工程 第一章 概论 第3题——韩婧
    现代软件工程 第一章 概论 第2题——韩婧
    小组成员邓琨、白文俊、张星星、韩婧
    UVa 10892 LCM的个数 (GCD和LCM 质因数分解)
    UVa 10780 幂和阶乘 求n!中某个因子的个数
    UVa 11859 除法游戏(Nim游戏,质因子)
    Codeforces 703C Chris and Road 二分、思考
    Codeforces 703D Mishka and Interesting sum 树状数组
    hdu 5795 A Simple Nim SG函数(多校)
    hdu 5793 A Boring Question 推公式(多校)
  • 原文地址:https://www.cnblogs.com/wcd144140/p/4662521.html
Copyright © 2011-2022 走看看