你好为什么变成了烫烫烫

“你好”为什么变成了”烫烫烫”

代码开路

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main()
{
printf("请输入女朋友名字");
// 字符串定义方式
//数据类型 变量名 = 字符串
char a[30];
scanf("%d<!>", &a);
printf("我女朋友的名字是%s", a);
return 0;
}

此处输出是会变成 我女朋友的名字是烫烫烫烫烫烫烫烫烫烫烫烫F??

原因:<!>处的 %d 使用不当

应该改为使用为 %s 字符串类型

下面是常用占位符和数据类型的解释

第一部分:常用数据类型(内存中的样子)

这部分决定了你定义的变量能存多大的数,以及它在内存里占多大空间。

分类 关键字 字节 (Byte) 取值范围简述 适用场景
整型 int 4 -21亿 ~ 21亿 存整数(最常用)
long long 8 极大的整数 存手机号、QQ号、超大计算
浮点型 float 4 6~7位有效数字 存小数(精度要求不高)
double 8 15~16位有效数字 存科学计算、高精度小数
字符型 char 1 -128 ~ 127 存单个字母、符号、数字
字符串 char[] 取决于定义 连续的多个字符 存名字、句子、路径

第二部分:占位符与类型匹配(代码里的样子)

这部分是 printfscanf 的核心,类型必须一一对应,否则就会出现之前的“烫烫烫”。

数据类型 占位符 示例代码 备注
int %d printf("%d", 100); d 代表 decimal(十进制)
long long %lld scanf("%lld", &bigNum); l 代表 long,ll 就是很长
float %f printf("%.2f", 3.14); 默认 6 位小数,.2 控制位数
double %lf scanf("%lf", &d); scanf 读 double 必须用 %lf
char %c printf("%c", 'A'); c 代表 character
char[] %s scanf("%s", arr); s 代表 string,不用加 &
地址 %p printf("%p", &a); p 代表 pointer(指针/地址)

你可以把变量想象成抽屉,占位符想象成开锁的钥匙

  • 数据类型:定义抽屉的大小。如果定义 char a[8],说明这个抽屉很小,且里面打算放字符,
  • 结果:输入的字符太大了(指3个汉字) 抽屉就会爆炸!
  • 占位符:决定你怎么拿东西。你用了 %d,相当于拿了一把“重型卡车”的钥匙去开“首饰盒”。
  • 结果:钥匙对不上(类型不匹配),拿出来的东西就全是乱码。

常用技巧总结:

  1. 整数全家桶:%d (小), %ld (中), %lld (大)。

  2. 小数全家桶:%f (float), %lf (double)。

  3. 文本全家桶:%c (单字), %s (一串)。

    Ps 内存大小的计算公式(基础)

    其实字符串的内存计算,你只需要记住一个“排队领座位”的原则:

    字符串内存占用计算公式

    你可以把字符串占用的大小拆解为三部分相加:

    总字节数 = (中文个数 × 2) + (英文/符号/数字个数 × 1) + 1 (结束标记)

    拆开详细看:

    1. 中文(2字节/个):在 VS 默认环境下,一个汉字占两个位置。
    2. 英文/数字/符号(1字节/个):比如 a, 1, ! 都只占一个位置。
    3. 结束标记 \0(必须加 1):这是 C 语言字符串的“句号”。虽然你看不到它,但它必须占用一个字节的空间,否则程序不知道字符串到哪里结束(就会出现你之前的“烫烫烫”)。

    举两个例子(对照你的需求):

    例子 A:名字是“三张”

    • 计算:2个中文 × 2 = 4 字节
    • 加上结束标记:4 + 1 = 5 字节
    • 定义方式char name[5] = "三张";

    例子 B:名字是“Fox66”

    • 计算:3个英文/数字 × 1 = 3 字节

    • 加上结束标记:3 + 1 = 4 字节

    • 定义方式char name[4] = "Fox";

      💡 考试/练习小技巧

      如果你在写代码或者考试时,不确定对方会输入多长的名字,为了保险,数组的大小可以稍微写大一点

      1
      2
      // 比如定义 20,只要输入的名字总字节数不超过 19(留 1 给结束符),就绝对安全
      char str[20];

      总结笔记:

      • 汉字:双胞胎(占 2)。
      • 英数:单身汉(占 1)。
      • 最后:必须给“句号”留个座(占 1)。