C语言零碎知识点之字符串

字符串的表示

C语言中并没有字符串这个类型,表示字符串时,需要使用字符数组,或字符指针。即 char 型数组,或char *指针。

如果使用字符数组表示:

// 可以不指定字符数组的长度,但如果指定字符数组长度那么应该比实际字符串中的字符个数大
char str[20] = "hello world";

// 注意,不能使用下面的方式赋值
char str[20];
str = "hello world";

如果用字符指针表示:

char* str = "hello world";

// 注意,支持先声明再赋值的方式
char* str;
str = "hello world";

从键盘输入字符串

通常我们可能会需要用户输入字符串,可以通过scanf函数或者gets函数来完成。

可以直接输入一个字符串并存储,程序会自动在结束时加字符串结束符'\0'

无论是字符数组还是字符组指针,都可以通过scanf函数或者gets函数来输入:

// 1.字符数组
// 1.1 通过 scanf 函数输入,但注意不能输入带有空格的字符串
char str1[20];
scanf("%s", str1);
// 1.2 通过 gets 函数输入,可以输入带有空格的字符串,语法更简单
char str2[20];
gets(str2);

// 2.字符指针
// 2.1 通过 scanf 函数输入,需要先分配内存空间
char* str1 = (char *)malloc(sizeof(char)*20);
scanf("%s", str1);
// 2.2 通过 gets 函数输入,需要先分配内存空间,可以输入带有空格的字符串,并且语法更简单
char* str2 = (char *)malloc(sizeof(char)*20);
gets(str2);

gets()scanf() 的主要区别是:

  • scanf() 读取字符串时以空格为分隔,遇到空格就认为当前字符串结束了,所以无法读取含有空格的字符串。
  • gets() 认为空格也是字符串的一部分,只有遇到回车键时才认为字符串输入结束,所以,不管输入了多少个空格,只要不按下回车键,对 gets() 来说就是一个完整的字符串。

也就是说,gets() 能读取含有空格的字符串,而 scanf() 不能。

注意:

  • 使用scanf函数输入字符串时,不需要指定&符号。如scanf("%s", &str);是错误的。因为数组名和字符指针名都表示地址。
  • 使用char *字符指针声明字符串时,需要先分配内存空间才能使用。

输出字符串

对于字符串的输出我们可以采用 printf 函数或者 puts 函数。

char str[]="hello world";

// 使用 printf 函数输出字符串,需要指定格式控制符 %s
printf("%s", str);

// 使用 puts 函数输出字符串
puts(str);

printf 函数和 puts 函数的主要区别是:

  • puts():专门用来输出字符串的,且只能输出字符串,输出字符串后自动换行。
  • printf():可以用来输出字符串,也可以输出其他类型的数据。通过格式控制符 %s 输出字符串,不能自动换行。

注意:

  • 无论是 printf 还是 puts 函数输出字符串时,都只需要传入字符串名就可以了。

访问字符串中的字符

无论是字符数组声明的字符串还是字符指针声明的字符串,都可以通过下面两种方式进行访问:

  • 第一种,下标
// 字符数组声明的字符串
char str[20] = "hello world";
char c;
c = str[1];// e

// 字符指针声明的字符串
char *str = "hello world";
char cc;
cc = str[1];// e
  • 第二种,* 操作符
// 字符数组声明的字符串
char str[20] = "hello world";
char c;
c = *(str + 1);// 通过字符串名加下标的方式

// 字符指针声明的字符串
char *str = "hello world";
char cc;
cc = *(str +1);// 通过字符串名加下标的方式

注意:

  • 数组下标是从 0 开始的,从 len-1 结束的。通常 len 指字符串实际字符个数。
  • *(str + i) 中 str 表示字符串名,而 i 表示待访问字符的下标,从 0 开始。
  • *str 默认访问字符串的第一个字符,等价于 *(str + 0)
  • *(str +i) 中的括号是必须的。

修改字符串中的字符

只有字符数组声明的字符串才能通过下标的方式进行修改,而字符指针声明的字符是不允许被修改的:

// 通过下标进行修改
char str[20] = "hello world";
str[1]='m';// 直接通过下标访问重新赋值即可

// 通过 * 操作符进行修改
char str[20] = "hello world";
*(str+1)='m';// 通过字符串名加下标的方式通过 * 操作符访问然后修改

// 下面的代码是错误示范
char *str = "hello world";
str[1]='x';// 错误
*(str+1)='x';// 错误

为什么字符指针声明的字符串不能被修改呢?如 char *str = "hello world"; 中的 "hello world"本身默认是一个字符串常量,它的值不容修改,而 str 只是一个指针,指向该字符串的首地址,对指向的地址空间的值的改变是不允许的。

计算字符串的长度

在C语言中我们可以自己写代码计算字符串中实际字符个数,也又可以通过引入 #include <string.h> 中的 strlen() 函数来计算:

  • 第一种,自己写代码计算,根据 '\0' 是字符串的结尾符
#include <stdio.h>

int main(){
    char str[] = "hello world";
    int i=0;
    int len=0;// 记录字符串中实际字符数
    while(str[i]!='\0'){
        len++;
        i++;
    }
}
  • 第二种,调用 strlen() 函数
#include <stdio.h>
#include <string.h>

int main(){
    char str[] = "hello world";
    int len;
    len = strlen(str);
    printf("%d", len);
}

遍历字符串中的每个字符

对于遍历字符串中每个字符的需求是比较少的,通常遇到这种情况是在算法题中,我们需要明白字符串是以 '\0' 字符结尾的,所以如果要遍历字符串就要根据它来进行循环操作。

对于字符数组表示的字符串的遍历,可以通过下标的方式来访问字符串中的字符。例如:

char str[20] = "hello world";
int i=0;// 下标,初始为0
while(str[i]!='\0'){
    printf("%c", str[i]);// 输出字符
    i++;// 注意,下标移向字符串的下一个字符
}

如果想要使用 for 循环,通常结合字符串函数 strlen() 一起使用,该函数用来获取字符串中的实际字符个数。如:char str[20]="hello world";中的实际字符个数是 11 个。

char str[20] = "hello world";
int len = strlen(str);// 获取字符串中的实际字符个数
for(int i=0; i < len; i++){
    printf("%c", str[i]);
}

对于字符指针表示的字符串的遍历,既可以通过 * 符来访问字符串中的字符,又可以通过下标的访问来访问。例如:

char* str = "hello world";

// 1.使用下标的访问来访问遍历
int i=0;
while(str[i]!='\0'){
    printf("%c", str[i]);
    i++;
}

// 2.使用 * 操作符访问,但注意,字符串的指针也会向后移动
while(*str!='\0'){
    printf("%c", *str);
    str++;// 移动字符串指针
}

// 3.使用 * 操作符和下标的方式访问,字符串的指针可以不用移动
int i=0;
while(*(str+i)!='\0'){
    printf("%c", *(str+i));
    i++;// 只需要移动下标,而不需要移动字符串指针
}

注意:

  • 通常遍历字符串所有字符,采用 while 循环,而使用不等于 '\0' 字符作为结束循环的条件。
  • 下标从 0 开始。
  • 无论是字符数组声明的字符串还是字符指针声明的字符串,都可以通过 strlen() 函数获得字符串中的实际字符个数。
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值