scanf循环读取一次输入

scanf循环读取一次输入

背景

有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面m个数。

输入提示:”共有多少个数?”
输入格式:”%d”
输入提示:”后移多少个?”
输入格式:”%d”
输出提示:”请以,号为间隔输入%d个数。\n”
输出格式:”%d,”
输出提示:”移动后顺序为:\n”
输出格式:”%d,”

程序的运行示例如下:
共有多少个数?5
后移多少个?2
请以,号为间隔输入5个数。
1,2,3,4,5
移动后顺序为:
4,5,1,2,3

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define MAX 1000

void move(int*, int, int);

int main(void)
{
int a[MAX], n, m;
char sep;
printf("共有多少个数?");
scanf("%d", &n);
printf("后移多少个?");
scanf("%d", &m);
printf("请以,号为间隔输入%d个数。\n", n);
for (int i = 0; i < n; i++)
{
scanf("%d%c", &a[i], &sep);
}
move(a, n, m);
return 0;
}

void move(int a[], int n, int m)
{
int b[MAX];
for (int i = 0; i < n; i++)
{
b[(i + m) % n] = a[i];
}
printf("移动后顺序为:\n");
for (int i = 0; i < n; i++)
{
if (i == n - 1)
{
printf("%d", b[i]);
}
else
{
printf("%d,", b[i]);
}
}
}

一次输入,循环读取

怎么实现输入一次:1,2,3,4,5 循环赋值给数组a?

逗号的处理是关键

for 循环中使用 scanf 处理带逗号的输入,核心难点在于:scanf 在读取数字时会停在逗号前,但逗号还留在缓冲区里,必须把它“吃掉”,否则下一次循环读取数字时会出错。

这里有最适合新手的两种实现方法:

方法一:引入一个“垃圾桶”变量(最推荐,逻辑清晰)

我们可以定义一个 char 类型的变量(比如叫 sepdummy),专门用来接收那个不需要的逗号。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>

int main() {
int a[5];
char sep; // 专门用来存逗号的“垃圾桶”

printf("请输入5个数字,用逗号隔开 (例如 1,2,3,4,5): \n");

for (int i = 0; i < 5; i++) {
// %d 读取数字存入 a[i]
// %c 读取紧跟在后面的字符(逗号或回车)存入 sep
scanf("%d%c", &a[i], &sep);
}

// 验证一下是否存进去了
printf("你输入的数组是: ");
for (int i = 0; i < 5; i++) {
printf("%d ", a[i]);
}

return 0;
}

原理解析:

  1. 第一次循环:输入 1,%d 读了 1%c 读了 ,。一切正常。
  2. 最后一次循环:输入 5 后面紧跟的是回车(换行符)。此时 %d 读了 5%c 读了 \n(换行符)。
  3. 因为 %c 既能吃逗号也能吃回车,所以这个逻辑是通用的,非常稳健。

方法二:利用赋值抑制符 %*c(代码更少,稍微高级一点)

C 语言的 scanf 有一个特殊的符号 *,加在格式符中间(如 %*c),意思就是:“读取这个数据,但是丢弃它,不要赋值给任何变量”。

这样你就不需要专门定义那个 char sep 变量了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>

int main() {
int a[5];

printf("请输入5个数字,用逗号隔开: \n");

for (int i = 0; i < 5; i++) {
// %*c 表示读取一个字符并丢弃
scanf("%d%*c", &a[i]);
}

// 验证输出
for (int i = 0; i < 5; i++) {
printf("%d ", a[i]);
}

return 0;
}

恶心的题目:

题目最后要求打印:4,5,1,2,3
很反人类,所以需要if进行判断处理


scanf循环读取一次输入
http://example.com/2025/12/06/scanf循环读取一次输入/
作者
王柏森
发布于
2025年12月6日
许可协议