c语言复习:字符串

注:本文是对苏小红版c语言程序设计第10章的笔记

  1. 字符串实际就是由若干有效字符构成且以字符’\0’作为结束的一个字符序列(但字符’\0’不会显示在屏幕上)
  2. 字符数组是由字符构成的数组,仅当其最后一个元素是’\0’时才表示字符串,’\0’不计入字符串长度,但要计入字符数组的长度
  3. 当省略对数组长度的声明时,必须人为地在数组的初始化列表中添加’\0’,才能将其作为字符串来使用。
    e.g.:
char str[] = {"H", "e", "l", "l", "0"};

的声明方法是错误的,因为系统会将str初始化为一个长度为5的数组,没有多余的空间存储’\0’

  1. 更简单的声明方法:char str[] = {"Hello"};
    或:char str[] = "Hello";

  2. 二位字符数组第二位长度不能省略(二位数组是按行存储的)

  3. 字符指针:char *ptr = "Hello"

char *ptr; 
ptr = "Hello" 

char *ptr;
ptr = str;

char *ptr;
ptr = &str[0];

都等价
若想把ptr指向的字符串的第一个字符修改为’W’, 则可以写成:

*ptr = 'W';
  1. *(ptr + i) <=> *(str + i), 即 str[i]
    也可以通过ptr++操作移动ptr, 但不能用str++

  2. 字符串的输入方法:
    单个字符输入/输出,循环
    e.g.:

for(i = 0; i < n; i++)
{
scanf("%c", &str[i]);
}
for(i = 0; i < n; i++)
{
printf("%c", str[i]);
}
//输出也可以采用do-while语句,判断条件为str[i] != '\0'

作为字符串整体读入:
scanf(“%s”, &str);
遇到空格即停止读入,不能输入带空格的字符串
不读走回车,回车符仍留在缓冲区中
e.g.输入Hello World str中只有Hello
gets():
以回车作为字符串的终止符,并将回车从缓冲区读走,但不作为字符串的一部分。
注意:gets 和scanf都不能限制输入字符串的长度,很容易引起缓冲区溢出。所以用scanf和gets输入字符出纳时,要确保输入字符串的长度不超过数组的大小,否则建议使用能限制输入字符串长度的函数,如:fgets(name, sizeof(name), stdin);

  1. 用puts()输出:
    函数puts用于从括号内的参数给出的地址开始,一次输出存储单元中的字符,当遇到第一个’\0’时输出结束,并自动输出一个换行符。
    e.g.:
#include <stdio.h>
int main(){
    char a[] = "abc";
    puts(a);
    return 0;
}
  1. 常见的字符串处理函数:
    |函数功能| 调用形式 | 注意 |
    |–|--|
    | 求字符串长度 | strlen(str) | 不包括 ‘\0’ |
    | 字符串复制 | strcpy(str1, str2) | 将str2复制给str1(str2是模版) |
    | 字符串比较 | strcmp(str1, str2) | 若1>2,返回值大于0;1=2,等于0;1<2,小于0 |
    | 字符串连接 | strcat(str1, str2) | 将str2添加到str1末尾,并覆盖1末尾的’\0’,调用后返回str1的首地址(str1应足够大) |
    | “n族”字符串复制 | strncpy(str1, str2, n) | 将str2的至多前n个字符复制到str1 |
    | “n族”字符串比较 | strncmp(str1, str2, n) | 最多比较前n个字符 |
    | “n族”字符串连接 | strncat(str1, str2, n) | 将2的至多前n个字符添加到1的末尾 |
    注意:

    1. 赋值运算不能用于字符串的赋值操作,字符串赋值只能使用函数strcpy()
    2. 比较字符串不能直接使用 > <, 而应使用strcmp()
  2. 通常不使用计数控制的循环来判断数组元素是否遍历结束,而使用条件控制的循环,利用字符串结束标志’\0’判断字符串中的字符是否遍历结束。

  3. const类型限定符号

    1. const int *p = &a
    2. int const p = &a
      以上两种情况等价,p是一个指针变量,而
      p是一个常量。
      对a执行赋值操作是合法的,执行赋值操作p = &b也是合法的,但直接对*p进行赋值是不合法的。
    3. int* const p = &a
      p是常量,而*p是一个常量。即p的指向不能改变,但a的值可以改变。
      如 *p = 20是合法的,p = &b是非法的。
    4. const int const *p = &a
      p是一个指针常量,指向一个常数。
  4. 字符处理函数:

    1. int isdigit(int c);判断是不是数字,若是,返回真;否则返回假(0)
    2. int isalpha(int c);判断是不是字母
    3. int isalnum(int c);判断是不是数字或字母
    4. int islower(int c);判断是不是小写字母
    5. int isupper(int c);判断是不是大些字母
    6. int tolower(int c);若是大写,则转换成小写字母后返回,否则返回原值
    7. int toupper(int c);若是小写,则转换成大写后返回,否则返回原值
    8. int isspace(int c);判断是不是空白符(’\n’, ’ ', ‘\f’, ‘\r’, ‘\t’, ‘\v’)
    9. int iscntrl(int c);判断是不是控制字符(’\t’, ‘\v’, ‘\f’, ‘\a’, ‘\b’, ‘\r’, ‘\n’)
    10. int isprint(int c);判断是不是包含空格在内的可打印字符
    11. int isgraph(int c); 判断是不是除空格以外的可打印字符
  5. 字符串转换函数

    1. double atof(const char*nPtr); 将nPtr指向的字符串转换为double并返回。若首字符是字母,则无定义。
    2. int atoi(const char *nPtr);将…转换为int并返回,…
    3. long atol(const char *nPtr);将…转换为long并返回,…

猜你喜欢

转载自blog.csdn.net/XIAOHEwenjue/article/details/84636624