任何人都可以告诉我为什么我的代码工作正常,直到最后一刻,我问用户他们是否想再玩一次?出于某种原因,程序似乎忽略了这行代码。请保持温和,因为我是编程新手并尝试自学Objective-C。这个程序是典型的noobs,我生成一个随机数,要求用户猜测,然后询问他们是否想再玩一次。谢谢。
#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
答案 0 :(得分:1)
将评论转换为答案:
可能最终
之前留空scanf()
读取换行符并继续(数字不读取换行符)。也许在%c
:scanf(" %c", &play);
检查
scanf()
的返回值,甚至可以检查读取的字符。
还击:
%c
之前的那个空间就行了。怎么会有人学到这样的东西?我认为它是在阅读\n
字符而不是我想要阅读的内容,它可能是'y'或'n'。根据我的理解,%d
整数不会在换行符中读取,但%c
会怎样?那是对的吗?而防止这种情况的方法是使用空间?我只是不知道如何做到这一点。
回复:
通过非常仔细地阅读
scanf()
的手册页,或经历过痛苦的经历(或通过回答关于它的大量问题)。scanf()
系列函数功能非常强大,并且难以准确使用。我通常建议使用fgets()
来读取输入行:char line[4096]; if (fgets(line, sizeof(line), stdin) != 0) { ...use line... }
与
sscanf()
结合使用来解析该行的数据。它通常会导致您遇到的那种惊喜减少。您应始终检查scanf()
转化次数与预期一致。
scanf()
中的空格 - 家庭格式字符串的作用是错综复杂的。大多数转换说明符会自动跳过前导空格(包括换行符),因此格式字符串"%d%d"
将读取整数值,其中第一个值可以在任意数量的空格之前,第二个也可以在此之前通过任意数量的空白区域。转换将在第一个不能成为第二个整数一部分的字符处停止(除非之前有错误)。如果您输入8
和换行符作为输入,则转换会在换行符(\n
)上停止,并留下是否要读取下一个输入。
数字转换和字符串转换%s
都会跳过前导空格。单字符格式(%c
)和扫描集%[a-z]
不会跳过前导空格。
当格式中出现空白字符时,如"%d %c"
中所示,则表示数据中的任意数量的空白区域,包括零。因此,在以下每一行中,接收%c
格式的变量每次都会获得Z
:
123Z
123 Z
123 Z
123
Z
(最后两行一起读取最后一个输入。)