- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
任何人都可以告诉我为什么我的代码工作正常,直到我到达最后的不足,我询问用户是否想再次玩?由于某种原因,程序似乎忽略了这行代码。请温柔一点,因为我是编程新手,正在尝试自学 Objective-C。这个程序对于菜鸟来说是典型的,我生成一个随机数,要求用户猜测,然后询问他们是否想再玩一次。谢谢。
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool {
int randomNumber = arc4random_uniform(100); // This is a random number generator that gens a num betw 0 and 100
int userNumber; // This is the number that the user picks intially
int attempts = 0; // This is the number of attempts the user makes during each game
int games = 0; // This is the number of games the user has played
char play = 'n'; // This is whether the user wants to play again, intially set to 'y'
scanf("%c", &play);
while (play == 'y') {
NSLog(@"Random number is: %d", randomNumber);
NSLog(@"Enter a number between 0 and 100");
scanf("%d", &userNumber);
games++; // Increment the number of games the user has played to 1
if (userNumber == randomNumber) {
attempts++;
NSLog(@"Congratulations. You guessed correctly!");
}
attempts++;
while (userNumber != randomNumber) {
if (userNumber < randomNumber) { // Guess is too low
attempts++; // attempt is incremented
NSLog(@"Too low. Try again!"); // User tries again
scanf("%d", &userNumber);
}
if (userNumber > randomNumber) { // Guess is too high
attempts++; // attempt is incremented
NSLog(@"Too high. Try again!"); // User tries again
scanf("%d", &userNumber);
}
}
NSLog(@"Congratulations. You guessed correctly!");
NSLog(@"It took you %d attempts to guess correctly", attempts);
NSLog(@"Do you want to play again?");
scanf("%c", &play); // --------- Here is where things to wrong ---------
} // while play is yes
} // autoreleasepool
return 0;
} // main
最佳答案
将评论转换为答案:
Probably, the final
scanf()
reads a newline and continues (the numbers don't read the newline). Maybe put a blank before the%c
:scanf(" %c", &play);
Check the return value from
scanf()
, and maybe even check which character was read.
反击:
That space before the
%c
did the trick. How does anyone ever learn things like that? I think it was reading the\n
char rather than what I wanted it to read, which was either 'y' or 'n'. For my understanding, the%d
integer doesn't read in the newline, but the%c
does? Is that correct? And the way to prevent this is to use a space? I just don't get how I would ever know to do that.
响应:
By reading the manual page for
scanf()
very carefully, many times over, or by bitter experience (or by answering lots of questions on SO about it). Thescanf()
family of functions are extremely powerful and extremely difficult to use accurately. I generally recommend usingfgets()
to read lines of input:char line[4096];
if (fgets(line, sizeof(line), stdin) != 0)
{
...use line...
}combined with
sscanf()
to parse the data on the line. It generally leads to fewer surprises of the sort you just ran into. You should always check thatscanf()
made as many conversions as you expected.
scanf()
系列格式字符串中空格的作用非常复杂。大多数转换说明符会自动跳过前导空格(包括换行符),因此格式字符串 "%d%d"
将读取整数值,其中第一个值前面可能有任意数量的空格,第二个前面也可以有任意数量的空格。转换将在第一个不能属于第二个整数的字符处停止(除非之前出现错误)。如果您键入 8
和换行符作为输入,则转换会在换行符 (\n
) 处停止,并留下 if 以供下一个输入读取。
数字转换和字符串转换%s
都会跳过前导空格。单字符格式 (%c
) 和扫描集 %[a-z]
不会跳过前导空格。
当格式中出现空白字符时,如“%d %c”
,则它表示数据中任意数量的空白,包括零。因此,在以下每一行中,接收 %c
格式的变量每次都会获得 Z
:
123Z
123 Z
123 Z
123
Z
(最后两行一起读取以获取最后一个输入。)
关于c - 为什么我的最终 scanf 不停止并读取用户输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16125423/
考虑需要与 iOS 5 和 iOS 6 兼容的应用。 有没有办法标记纯粹为了 iOS 5 兼容性而存在的代码,以便当部署目标最终更改为 iOS 6 时它显示为编译错误(或警告)? 像这样: #IF_D
我想我知道答案但是...有什么方法可以防止全局变量被稍后执行的 修改吗? ?我知道全局变量首先是不好的,但在必要时,有没有办法让它成为“最终”或“不可变”?欢迎黑客/创造性的解决方案。谢谢 最佳答案
class Foo { final val pi = 3 } 是否每Foo对象有一个 pi成员?因此我应该把 pi在伴生对象中? 最佳答案 如果您担心内存占用,您可以考虑将此字段移动到伴随对象中。
随着可用的 Web 开发框架种类繁多,似乎总是有一种“尝试新事物”的永久动机。因此,我们中的一些人发现自己用一个框架换另一个框架,从来没有对最终结果完全满意。当然,总会有一个特定的 Web 框架可以完
在MDN中指出, If the finally block returns a value, this value becomes the return value of the entire try
我正在尝试用 JavaScript 制作一个基本的井字棋类型游戏。尽管 x 和 y 值在 if 语句的范围内,但除最后一个之外的所有空格都有效。 我不知道为什么最后的 else if 语句不起作用。
我想知道如何使用PowerMock模拟kotlin最终类(class),以便进行测试。我按照指南测试了Java最终类,但仍然出现此错误 Cannot subclass final class 有什么办
考虑以下设置: // debugger class public class Debug { // setting public final static boolean DEBUG
给定以下类(class): public class SomeClass { private final int a; public SomeClass(int a) {
This question already has answers here: What does “final” do if you place it before a variable?
我有一个类PasswordEncryptor,它使用org.jasypt.util.password.StrongPasswordEncryptor作为其字段之一,因为我试图使应用程序“可集群”所有类
我今天有一个关于 StreamReader 类的问题。具体使用文件名参数初始化此类例如: TextReader tr = new StreamReader(fileName); 显然,当此操作完成后,
我想弄清楚什么是使用带锁的 try/finally 的最佳方式。 当我在同一个地方有 lock() 和 unlock() 时,我只使用 try/finally block 作为 JavaDoc还建议:
在 Java 中序列化后是否可以将 final transient 字段设置为任何非默认值?我的用例是一个缓存变量——这就是它是 transient 的原因。我还有一个习惯,就是制作不会改变的 Map
在this问题说 final transient 字段在序列化后不能设置为任何非默认值。那么,为什么我为 aVar1 变量设置了 3,为 aVar3 变量设置了 s3? import java.io.
在Xbox上进行开发时,我使用的是F#规范中最终工作流程的修改版。 Xbox上的.net框架似乎不支持尾部调用。因此,我必须在编译时禁用尾部调用优化。 尽管起初看来这种限制会阻止在计算表达式中使用任何
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我想让我的带有自定义对象的ArrayList成为最终对象,以便对象在设置后无法更改。 我试图这样声明它: private final ArrayList XML = new ArrayList();
我有一个场景,我需要类似于 .NET 的 try-catch-finally block 的内容。 在我的尝试中,我将创建一个#temp表,向其中插入数据并基于#temp处理其他数据集。 先是CATC
对此可能有一个简单的答案,但尝试充分使用 Butterknife,将一些 findViewById 转换为 @BindViews,并注意到我无法在需要声明为 Final 的 View 上使用 Bind
我是一名优秀的程序员,十分优秀!