C Day 1

在千问的帮助下
目标:编写一个能询问用户姓名并打招呼的 C 程序
核心知识点#includeprintfscanf、字符数组(字符串变量)
环境:Windows + VS Code + GCC (MSYS2 UCRT64)


🧩 完整代码

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

int main() {
char name[50];
printf("What's your name? ");
scanf("%s", name);
printf("Hello, %s!\n", name);
return 0;
}

🔍 逐行解析

1. #include <stdio.h>

  • 作用:引入标准输入输出库(Standard Input/Output)
  • 为什么需要?
    C 语言本身不包含 printfscanf,它们定义在 stdio.h 头文件中。
  • 类比:就像手机要装“微信”才能发消息,程序要 #include 才能用这些功能。

2. int main() { ... }

  • 作用:程序的入口点(所有 C 程序从这里开始执行)
  • int 表示:函数返回一个整数(通常 return 0 表示成功)

3. char name[50];

  • 作用:声明一个能存储最多 50 个字符的字符串变量,名为 name
  • 关键概念
    • char:字符类型(可存字母、数字、符号等)
    • [50]:数组大小(C 中字符串必须预先分配空间)
    • 注意:实际最多存 49 个字符 + 1 个结束符 \0

💡 千问说我们小白可以理解为:“创建一个叫 name 的盒子,最多装 50 个字。”


4. printf("What's your name? ");

  • 作用:向屏幕输出文字
  • 格式说明
    • 普通文本直接写在双引号内
    • \n 表示换行(本例未加,所以光标停在问号后)

5. scanf("%s", name);

  • 作用:从键盘读取一个单词(不含空格),存入 name
  • 参数详解
    • "%s":格式说明符,表示“读一个字符串”
    • name:变量名(数组名不需要加 &
  • ⚠️ 注意事项
    • 遇到空格、回车即停止(不能读带空格的名字)
    • 不会自动清空缓冲区(后续课程会讲更安全的输入方式)

6. printf("Hello, %s!\n", name);

  • 作用:输出包含变量值的句子
  • %s 的含义
    • 是一个“占位符”,会被后面的 name 变量内容替换
    • 必须与传入的变量类型匹配(字符串 → %s

✅ 正确:printf("Hi %s", name);
❌ 错误:printf("Hi #s", name);#s 不是占位符!)


7. return 0;

  • 作用:告诉操作系统“程序成功结束”
  • 约定0 = 成功,非 0 = 出错

🛠 编译与运行命令

在项目目录的终端中执行:

1
2
3
4
5
# 编译:将 .c 源文件转为 .exe 可执行文件
gcc day1_greet.c -o greet

# 运行
./greet

✅ 预期输出:

1
2
What's your name? TangShiMei
Hello, TangShiMei!

❌ 常见错误与解决

错误现象 原因 修复方法
error: implicit declaration of function 'print' 写了 print 而不是 printf 改为 printf
输出 Hello, #s! 格式串写成 "#s" 改为 "%s"
输出 Hello, ;! scanf 参数写错,如 scanf("%s,name") 改为 scanf("%s", name)
中文乱码 终端编码与源文件编码不一致 暂时用英文;或终端执行 chcp 65001 切 UTF-8

💡 学习建议

  1. 自己敲代码,不要复制粘贴 —— 手动输入能强化记忆
  2. 故意制造错误,观察报错 —— 这是理解语法的最佳方式
  3. 项目路径用纯英文(如 D:\c_practice)—— 避免特殊字符引发奇怪问题
  4. 每次只改一行,立刻测试 —— 小步快跑,快速反馈

📅 下一步可以学

  • 添加第二个变量(如 city
  • 使用 if 判断名字是否为特定值
  • 用循环让程序持续运行

这里是千问的话👇
记住:每个程序员都曾卡在 printfscanf 上。
你能走到这里,已经超越了昨天的自己。继续加油!💪