scanf使用的一个小陷阱


今天在写一个排序的小程序的时候偶然发现scanf使用的一个小小的陷阱,如果没有见过的话很难发现的。

比如说scanf("%d", &A) 和 scanf("%d ", &A)这2个语句有区别吗?不仔细看是看不出区别的,前者%d后面紧跟这的是引号,后者%d后面加了一个空格然后再是引号。


/* test1.c */
#include <stdio.h>
#define N 5

int main(void) {
    int A[N];
    int i;
    for (i = 0; i < N; i++){
        scanf("%d", &A[i]);
    }
    for (i = 0; i < N; i++){
        printf("%d ", A[i]);
    }
    return 0;
}




这个程序的目的是从屏幕输入5个数字,并打印出来,这个程序运行的结果很正常,但是如果换第二种情况


/* test2.c */

#include <stdio.h>
#define N 5

int main(void) {
    int A[N];
    int i;
    for (i = 0; i < N; i++){
        scanf("%d ", &A[i]);
    }
    for (i = 0; i < N; i++){
        printf("%d ", A[i]);
    }
    return 0;
}




就是多了一个空格但是却要输入6个数字才能打印前5个数字出来,真是奇怪啊。

上网搜了一下发现http://stackoverflow.com/questions/12704907/explain-what-is-difference-between-without-whitespace-in-scanf-and-with-whitespa 有人问同样的问题,

里面的答案说是scanf函数中前面用引号引起来的字符串是匹配字符串,里面一个空格可以匹配多个空格,tab, 回车,所以在第二种情况下输完5的时候输入回车想结束对整个数组的输入,但是C编译器却觉得你的输入还没有结束,所以会继续等待输入,这时候如果加入一个Ctrl-D就行了,在linux中这个是文件终止符。

看到这里发现输入和输出里面也有这么多技巧,我们从屏幕输入时编译器会把输入的一切东西当作一个字符串存起来,然后和匹配字符串匹配,匹配完了的才能保存到变量中,

这里面的匹配算法可以深入研究一下。



### 回答1: 这是一个比较通用的方法来编写一个小游戏用 C 语言: 1. 首先,确定游戏的目标和规则。这可能包括游戏的玩法、胜负条件、游戏元素和游戏流程等。 2. 其次,确定游戏的用户界面。这可能包括游戏的菜单、按钮、文本框、图像和其他元素,以及如何显示这些元素并响应用户输入。 3. 然后,设计游戏的数据结构和算法。这可能包括游戏状态、游戏元素的位置和状态、分数和其他游戏变量,以及如何更新这些变量并实现游戏规则。 4. 最后,实现游戏的代码。这可能包括初始化游戏、绘制游戏界面、更新游戏状态、处理用户输入、结束游戏等。 注意:这只是一个大致的指导方针,实际的游戏开发过程可能会有所不同。 ### 回答2: 我使用C语言编写了一个经典的文本冒险小游戏。游戏的基本思路是玩家需要在一个虚拟的迷宫探索并寻找出口。 游戏开始时,玩家将在迷宫的入口处开始。玩家可以通过输入命令来控制角色的移动,例如"w"表示向上移动,"s"表示向下移动,"a"表示向左移动,"d"表示向右移动。玩家还可以输入"exit"命令来退出游戏。 迷宫的地图是一个二维数组,其不同的字符表示不同的地形,例如"#"表示墙壁,"."表示通道。玩家只能穿过通道,不能穿过墙壁。玩家每移动一步,游戏就会更新地图并显示新的位置。 玩家需要通过探索每一个房间来找到通往下一个房间的出口。在某些房间,玩家可能会遇到一些障碍物或陷阱,这些会耗费玩家的生命值。当玩家耗尽生命值时,游戏结束。 为了增加游戏的乐趣和挑战,我还添加了一些额外的功能。例如,玩家可以遇到一些隐藏的宝物,收集宝物可以得到额外的积分。另外,玩家还可以在特定地点使用道具,例如增加生命值或暂停敌人的移动。 整个游戏的开发过程涉及许多C语言编程的基本概念,例如循环结构、条件语句、函数等。通过编写这个小游戏,我巩固了自己对C语言的理解,并提高了自己的编程能力。 总而言之,使用C语言编写小游戏可以锻炼编程技能,提高逻辑思维能力,并为其他更复杂的游戏开发项目打下基础。 ### 回答3: C语言是一种功能强大的编程语言,也可以用来编写简单的小游戏。在编写游戏之前,我们首先需要了解游戏的基本要求和规则。下面是一个用C语言编写的猜数字小游戏的示例: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int answer, guess, attempts; attempts = 0; // 生成随机数作为答案 srand(time(0)); answer = rand() % 100 + 1; printf("欢迎来到猜数字游戏!\n"); do { printf("请输入一个1到100之间的整数:"); scanf("%d", &guess); attempts++; if (guess > answer) { printf("猜错了,太大了!请再试一次。\n"); } else if (guess < answer) { printf("猜错了,太小了!请再试一次。\n"); } else { printf("恭喜你猜对了!答案是 %d。\n", answer); printf("你用了 %d 次尝试。\n", attempts); } } while (guess != answer); return 0; } ``` 在这个小游戏,程序会生成一个1到100之间的随机数作为答案,然后玩家需要输入一个整数进行猜测。程序会根据猜测的结果给出相应的提示,直到玩家猜对为止。游戏结束时,程序会显示玩家猜对的次数。 这只是一个简单的示例,实际上可以用C语言实现更复杂的游戏。通过使用条件语句、循环和随机数等基本的编程概念,开发者可以创作出各种有趣的游戏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值