使用 scanf 输入字符串
本课属于 Coddy C 学习旅程的“逻辑与流程”单元。第 14 课,共 63 课。
现在你已经了解了字符串如何与空终止符配合工作,接下来该学习如何获取用户输入的字符串了。scanf 函数可以使用 %s 格式说明符读取字符串,但它有一些重要的限制,你需要了解。
要使用 scanf 读取字符串,你需要使用 %s 格式,并传入字符数组的名称(不带 & 运算符,因为数组名称本身就是地址):
char word[50];
printf("Enter a word: ");
scanf("%s", word);
printf("You entered: %s\n", word);不过,scanf("%s", ...) 有一个关键限制:它一遇到空白字符(空格、制表符或换行符)就会停止读取。这意味着,如果用户输入 "Hello World",scanf 只会读取 "Hello",并将 "World" 留在输入缓冲区中。
另一个严重的问题是,scanf 不会检查输入是否能放进你的数组。如果有人输入的单词长度超过数组的容量,就会导致缓冲区溢出,可能使程序崩溃或产生安全漏洞。请始终确保字符数组足够大,能够容纳预期的输入。
尽管存在这些限制,scanf("%s", ...) 非常适合读取单个单词,这正是你将在接下来的挑战中练习的内容。
挑战
简单编写一个 C 程序,演示如何使用 scanf 读取用户输入的字符串,并将其显示出来。你的程序应当:
- 声明一个名为
username、包含 30 个元素的字符数组,用于存储用户输入 - 声明一个名为
hobby、包含 25 个元素的字符数组,用于存储另一项输入 - 使用
printf提示用户,显示消息 "Enter your username:" - 使用
scanf和%s格式说明符,将用户名读入username数组 - 使用
printf提示用户,显示消息 "Enter your hobby:" - 使用
scanf和%s格式说明符,将爱好读入hobby数组 - 使用
printf按照下方显示的确切格式打印两个字符串
输入将以两个单独的单词提供(每个单词中不含空格)。
输出应按以下格式显示结果:
Enter your username:
Enter your hobby:
Hello [username], your hobby is [hobby]!例如,如果用户输入 "Alice" 作为用户名,并输入 "reading" 作为爱好,输出应为:
Enter your username:
Enter your hobby:
Hello Alice, your hobby is reading!这个挑战将检验你是否理解如何使用 scanf 和 %s 格式说明符读取字符串输入,如何正确声明容量足够的字符数组,以及如何使用 printf 将用户输入与格式化输出结合起来。
亲手试试
#include <stdio.h>
int main() {
// TODO: 在这里声明你的字符数组
// TODO: 在这里编写代码,提示并读取输入
// TODO: 打印最终的输出消息
return 0;
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: C 在线编译器