C语言 字符串的读取

字符串
char str[] = {'V', 'V', 'c', 'a', 't', '\0'};
  • 字符串最适合放在char数组中存储。
  • 在字符串字面量的末尾加上一个叫作 null 字符的值为0的字符。用八进制转义字符表示 null 字符就是 ‘\0’ 。若用整数常量来表示就是0。
  • 末尾的 null 字符 ‘\0’ 是字符串结束的 “标志”。

注:

  • 由 5 个字符组成的字符串字面量 “VVcat” 实际上占用了 6个字符的内存空间。
  • 字符串字面量的中间也可以有 null 字符。不过应注意区分。字符串字面量 “ABC” 是字符串,而字符串字面量 “VV\0cat” 不是字符串。
#include <stdio.h>

int main(void){
	printf("sizeof(\"vvcat\")  = %u\n",    (unsigned)sizeof("vvcat"));
	printf("sizeof(\"vv\0cat\")  = %u\n",    (unsigned)sizeof("vv\0cat"));
}

运行结果:
在这里插入图片描述

字符数组的初始化
  1. 以下3种形式都可以实现字符数组的初始化赋值。
	1. char str[] = {'V', 'V', 'c', 'a', 't', '\0'};
	2. char str[] = "VVcat";
	3. char str[] =  {"VVcat"};

因为初始值的个数决定了数组元素的个数,所以元素个数可以省略。

  1. 除了初始化赋值的时候,不能将数组的初始值或字符串直接赋予数组变量。
    以下3种是错误的赋值方式:
char str[6];
1. str = {'V', 'V', 'c', 'a', 't', '\0'};
2. str = "VVcat";
3. str =  {"VVcat"};
  1. 若像下面这样声明,末尾就不会加上 null 字符。

    char str[] = {‘V’, ‘V’, ‘c’, ‘a’, ‘t’};
    这样的声明的变量不会被当做字符串,我们把它当做 5 个字符的集合,也就是“普通的”数组。

正确的赋值方式:

#include <stdio.h>

int main(void){
	char str[6];
	
	str[0] = 'V';
	str[1] = 'V';
	str[2] = 'C';
	str[3] = 'A';
	str[4] = 'T';
	str[5] = '\0';
	
	printf("字符串 str 为 \"%s\"。 \n", str);
	return 0;
}

运行结果:
在这里插入图片描述
数据虽然长度定义为6,但是除了null字符之外,剩下只可存储5个字符。

注:
如果将 ‘\0’ 放在数组的中间某个位置会出现以下结果:

#include <stdio.h>

int main(void){
	char str[6];
	
	str[0] = 'V';
	str[1] = 'V';
	str[2] = '\0';   // 将  '\0' 放在 下标为3的位置
	str[3] = 'C';
	str[4] = 'A';
	str[5] = 'T';
	
	printf("字符串 str 为 \"%s\"。 \n", str);
	return 0;
}

运行结果:
在这里插入图片描述
null 字符 ‘\0’ 是字符串结束的 “标志”。

空字符串
char name[] = "";
char s[] = {'\0'};

一个字符也没有的字符串,称为空字符串。因为即使没有字符,也需要表示结束的null字符,所以在内存空间上只有一个null字符。

#include <stdio.h>

int main(void){
	char name[] = ""; // 对数组初始化
	char s[] = {'\0'};
	
	printf("(unsigned)sizeof(name) = %u\n", (unsigned)sizeof(name));
	printf("(unsigned)sizeof(s) = %u\n", (unsigned)sizeof(s));
	printf("请输入名字:");
	scanf("%s", name);  // 不需要加上 &
	
	printf("早上好, %s !!\n", name);
	printf("中午好, %3s !!\n", name);
	printf("晚上好, %.3s !!\n", name);
	printf("夜晚了, %8s !!\n", name);
	printf("该睡了, %-8s !!\n", name);
	
	return 0;
}

运行结果:
在这里插入图片描述

为了从标准输入读取字符串,需要把scanf函数的转换说明设为 %s ,还必须传入数组name。
另外,scanf函数在将从键盘读取的字符串存储到数组中时,会在末尾加上null字符。

总结:
  • 1.输出最小宽度
    • %3s 表示至少输出 3位 实际位数。如果省略或实际输出的字符串位数超过指定值,则按实际位数输出。
    • 如果设置了 - 标志,则表示左对齐,否则表示右对齐(空白部分填补空格)。
  • 2.精度
    • %.3s 指定显示位数的上限为 3(即不可能显示超过指定位数的字符,超过则截去)。
  • 3.转换说明符
    • s 表示输出字符串。即输出数组的字符,直到null字符的前一个字符为止。如果没有指定精度或精度大于数据长度,则数组中必须含有null字符。
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值