scanf函数的修饰符的使用问题

在格式字符前使用修饰符以指定输入数据的宽度,如下面的程序,输入abcde,希望输出a,d,但是字符变量声明的先后顺序不同却使得结果不一样,导致的原因是什么呢?实在想不明白,希望大佬们能不吝赐教

# include<stdio.h>

int main(){
    char c1,c2;
    scanf("%3c%2c",&c1,&c2); 
    printf("%c,%c",c1,c2);
    return 0;
} 

输入:abcde
输出:e,d

# include<stdio.h>

int main(){
    char c2,c1; // why?
    scanf("%3c%2c",&c1,&c2); 
    printf("%c,%c",c1,c2);
    return 0;
} 

输入:abcde
输出:a,d

阅读 2.3k
2 个回答

这个和内存分配有关系, 局部变量是分配在栈上的, 栈是由高内存到低内存分配的.

案例一

char c1, c2

初始内存

  +-----+
  |     |      +   高
  |     |  c1  |
  |     |      |
  +-----+      |
  |     |      |
  |     |  c2  v   低
  |     |
  +-----+

第一次读取3个字符到c1的位置

+-------+
|       |
|       |
+-------+
|   c   |
|       |
+-------+
|   b   |
|       |
+-------+
|   a   |  c1
|       | 
+-------+
|       |  c2
|       |
+-------+

第二次读取2个字符到c2的位置

+-------+
|       |
|       |
+-------+
|   c   |
|       |
+-------+
|   b   |
|       |
+-------+
|   e   |  c1
|       | 
+-------+
|   d   |  c2
|       |
+-------+

案例二

初始内存

  +-----+
  |     |      +   高
  |     |  c2  |
  |     |      |
  +-----+      |
  |     |      |
  |     |  c1  v   低
  |     |
  +-----+

第一次读取3个字符到c1的位置

+-------+
|       |
|       |
+-------+
|       |
|       |
+-------+
|   c   |
|       |
+-------+
|   b   |  c2
|       | 
+-------+
|   a   |  c1
|       |
+-------+

第二次读取2个字符到c2的位置

+-------+
|       |
|       |
+-------+
|       |
|       |
+-------+
|   e   |
|       |
+-------+
|   d   |  c2
|       | 
+-------+
|   a   |  c1
|       |
+-------+

可以通过程序验证

#include <stdio.h>

int main() {
    char c2 = '1', c1 = '2';
    printf("c2 = %c\n", c2); // 此时c2等于 1
    scanf("%3c",&c1); 
    printf("c2 = %c\n", c2); // 此时c2等于 b
    return 0;
} 
  1. 你不能读取多个字符到一个字符的内存里面, 否则会有内存覆盖问题,会导致程序运行结果不正确或者程序段错误
  2. 如果想要跳过一些字符可以使用 scanf 函数的 %* 修饰符, 比如下面的代码:
#include <stdio.h>
int main(void){
    char c1, c2;
    scanf("%c%*2c%c", &c1, &c2); //读取第一个字符到c1, 跳过2个字符,读取下一个字符到c2
    printf("%c, %c", c1, c2);
    return 0;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进