Menu
CoddyTech

使用 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", ...) 非常适合读取单个单词,这正是你将在接下来的挑战中练习的内容。

challenge icon

挑战

简单

编写一个 C 程序,演示如何使用 scanf 读取用户输入的字符串,并将其显示出来。你的程序应当:

  1. 声明一个名为 username、包含 30 个元素的字符数组,用于存储用户输入
  2. 声明一个名为 hobby、包含 25 个元素的字符数组,用于存储另一项输入
  3. 使用 printf 提示用户,显示消息 "Enter your username:"
  4. 使用 scanf 和 %s 格式说明符,将用户名读入 username 数组
  5. 使用 printf 提示用户,显示消息 "Enter your hobby:"
  6. 使用 scanf 和 %s 格式说明符,将爱好读入 hobby 数组
  7. 使用 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;
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: C 在线编译器