《C prime plus (第五版)》 ---第11章 字符串和字符串函数

 11-1:字符串表示和字符串I/Oswift

  1.首先先经过一个总体的例子来初步了解创建,读入和输出字符串的几种方式。数组

#include<stdio.h>
#define MSG "你必定有不少智慧,告诉我一些吧!"
#define LIM 5
#define LINELEN 81
int main(){
    char name[LINELEN];
    char talents[LINELEN];
    int i ;
    const char m1[40] = "Limit yourself to one line's worth. ";
    const char m2[] = "If you can't think of anything,fake it. ";
    const char *m3 = "\nEnough about me - what's your name? ";
    const char *mytal[LIM] = {
    "Adding numbers swiftly",
    "MUltiplying accurately ",
    "Stashing data",
    "Following instructions to the letter",
    "Understanding the C language"
    };
    printf("你好阿,我是电脑机器人,我有一些智慧\n");
    printf("他们是什么呢?哦,对了,这里有部分清单:");
    for(i = 0 ; i < LIM ; i++){
    puts(mytal[i]);
    }
    puts(m3);
    gets(name);
    printf("哦,%s,%s\n",name,MSG);
    printf("%s\n%s",m1,m2);
    gets(talents);
    puts("Let's see if I've got that list: ");
    puts(talents);
    printf("谢谢你的信息,%s\n",name);
    return 0;
}

  2.定义字符串:基本的方法有字符串常量,char数组,char指针和字符串数组函数

    1)字符串常量:属于静态存储,是指若是在一个函数中使用字符串常量,即便屡次调用这个函数,这个字符串在程序的整个运行过程当中只存储一份。整个引号的内容做为指向该字符串存储位置的指针spa

    例如:指针

#include<stdio.h>
int main(){
    printf("%s,%p,%c\n","We","are",*"World");
}

  显示结果为:We 0x2321342 Wcode

    2)字符串数组及其初始化blog

     第一种方法是定义数组的大小,而后给出字符串。ip

     第二种方法是不给出数组的大小,而后给出字符串,大小由编译器计算。内存

     第三种方法是若是定义的数组须要在程序运行时才放入字符,那么必需要指明数组的大小。字符串

     第四种方法任何数组名都是数组首元素的地址。m1 == &m1[0]

     第五种方法是用指针符号来创建字符串:例如 const char *m3 = "Hello"   它和char m3[] = "Hello" 做用几乎相同。

     3. 可是也存在区别:数组初始化是从静态存储区把一个字符串复制给数组,而指针初始化只是复制字符串的地址。

#include<stdio.h>
int main(){
    char heart[] = "I love Tillie!";
    char *head = "I love Millie!";
    int i ;
    for(i = 0 ; i < 6 ; i++){
        putchar(heart[i]);
    }
    printf("\n");
    for( i = 0 ; i < 6 ; i++){
        putchar(head[i]);
    }
}

    4.在这个程序中,咱们学到的知识: 1)*head =head[0] 2)若是head = heart。那么head就指向了heart字符串,那么原来的Millie仍是存在的,可是若是没有保存这个字符串的地址的话,就没有办法再访问这个字符串了,石沉大海了。很难遇到。

    这里须要引入一个问题,char *word = "frame" , word[1] = 'l' => 这样作容许吗?  解答:可能编译器容许这么作,可是会形成内存访问错误。若是编译器使用这种单个拷贝表示法容许把第一个字符改变,那将影响到全部对这个字符串的使用,建议的作法是初始化一个指向字符串文字的指针使用const修饰符, const char *p1 = "Klingon" ;

    5.字符串数组:像最上面的程序中定义了一个指针字符数组。

    这样的一个字符数组在解释上相似于一个二维数组。

    区别是前一个是存放地址的数组,后者是放着完整的字符数组。

 

    最后要创建一种认识,绝大多数字符串使用的都是指针。观察这个程序

#include<stdio.h>
int main(){
    char  *mesg = "Don't be a fool!";
    char  *copy;
    copy = mesg;
    printf("%s",copy);
    printf("mesg = %s,&mesg = %p;value = %p\n",mesg,&mesg,mesg);
    printf("copy = %s,&copy = %p;value = %p\n",copy,&copy,copy

  这个运行结果代表:两个指针变量指向的都是同一个字符串。

11-2:字符串的输入: gets()函数 scanf() 函数  fgets()函数

  注意:在输入字符串的时候,要提早申明一块足够大的区域给它,计算机是不会计算字符串的长度的,后果是会致使输入的字符覆盖程序中其余的数据和代码,致使程序异常终止。

  1.gets()函数:从系统的标准输入设备得到一个字符串,当读到\n的时候,中止输入,舍去\n,补充\0。gets()函数若是成功读取字符串,会返回这个字符串的地址,例如char *ptr , ptr = gets(name);若是出错或者遇到文件结尾,它返回一个空(或0)地址。称为空指针。在<stdio.h>中用NULL来表示。gets(name)!=NULL 

  2.fgets()函数:fgets()函数要求指定最大的字符数,fgets(name,MAX,stdin) ,若是遇到换行符,也会把它读取,而不会扔掉。若是成功读取了字符串,会返回这个字符串的地址。若是出错或者遇到文件结尾,它会返回一个空(或0)地址。

  3.scanf()函数:比较的约束,%s,遇到空白符(空格,制表符,换行符)等都会中止。若是%10s,那么函数就会读取10个或如下中止。若是成功读取了字符,它会返回读取字符的个数,不然返回EOF。

 

  最后总结:gets()函数读取文本更快更好,scanf()函数主要以某种标准输入的混合类型数据的读取和转换。

相关文章
相关标签/搜索