C primer plus (第六版) 笔记

C primer plus (第六版)笔记

字符串和字符串函数

  1. 用双引号括起来的内容为“字符串字面量”,末尾会自动增加\0,存储到内存,属于静态存储内容。ANSI标准起字面量之间没有间隔,如:

    char Hello[] = "Hi, " "Bob! " "How are you?"
    //于其下等价
    char Hello[] = "Hi, Bob! How are you?"

     

 注意以下这样类型:最后的空字符,必须有,不然就不是字符串,而是一个字符数组.

const char more[] = {'P', 'r', 'o', 'b', 'l', 'y', ' ', 'u', 'n', 'l', 'i', 'k', 'y', '\0'}

同时要确保数组元素(末尾会有一个char形式的空字符)个数字少比字符串长度多一。

数组与指针的区别:初始化数组把静态存储区的字符串拷贝到数组中,而初始化指针只把字符串的地址拷贝给指针。

如何理解?对于上一个插入数组:

++more;//这样是错误的,more是地址常量。

上述说字符串是静态存储类别,在C primer plus中解释:程序开始时为该数组(字符串数组)分配内存,才将字符串拷贝到数组中。

以下是一些细节:

指针表示法和数组表示法没有区别,但只有指针表示法可以进行递增操作。

数组的元素是变量(除非申明加const),数组名不是变量(见上的代码)。

总结:指针指向的内容是静态存储的,不建议所指向的字符串是可修改的;可修改的,建议使用数组。但指针相对比数组分配内存效率来的高。

2.不幸的gets(),gets()的替代品:fgets()和get_s(),新手常见的scanf();

gets()函数普遍常见,fgets()最容易使用(方便,灵活),get_s安全,但处理起来比较麻烦

gets()读取整行输入,直到遇到换行符,丢弃换行符,存储其他的字符,并在其后加一个空字符('\0')为结束。

问题:如果输入字符串过长,会导致缓冲区溢出。(往往存储字符串的变量会有一个固定的存储空间)。

fgets()函数有三个参数,即fgets(char* , int  ,FILE );读取整行

第二个参数指明最大读入的字符数,当然如果提前读到换行符(同时也存储在字符串中)也会结束输入。

第三个参数指明要读入的文件,如果从键盘读取则用stdin(标准输入0)。

一些细节:

fgets()函数返回char类型指针,如果它没有读到文件末尾,则返回的地址与传入的第一参数相同,否则返回NULL。
参考以下程序:

#include <stdio.h>
#define STLEN 10
int main(void)
{
   char words[STLEN];
   int i;
   
   puts("Enter strings (empty line to quit):");
   while(fgets(words, STLEN, stdin) != NULL && words[0] != '\n')
   {
    i = 0;
    while(words[i] != '\n' && words[i] != '\n')
       i++;
    if(words[i] == '\n')
       words[i] = '\0';
    else
       while(getchar() != '\n')
          continue;
    puts(words);
   }
   puts("done");
   return 0;
}

gets_s()函数读取整行,有两个参数,一个指明最大字符数,一个是标准输入的,故没有第三参数,和gets()一样读到换行符会丢弃,不存储;

读到最大字符数都没有读到换行符时,如果没有编写“处理函数”,程序会终止或退出。

scanf()函数,更像是“获取单词”函数;不同于之前的“获取字符串函数”。两种方法确定输入结束:

1.以下一个空白字符(空行,空格,制表符或换行符)作为字符串的结束(字符串不包括空白字符)。

2.如果指定了宽度,如%8s,那么scanf()函数读到10个字符或满足上一条件,结束输入。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值