我正在使用Objective-C开发一个控制台应用程序。我已经有了它的工作,但是当手动测试边缘情况时,我发现了一个我无法解释的奇怪行为。
基本上,我在循环中设置了scanf(),当用户键入无效信息时,它会输出“无效选项”消息。然后,如果输入长度小于9个字符,它将按预期再次循环。但是,如果输入为9个字符或更长,则会在某一行上出现EXC_BAD_ACCESS错误。
(如果我注释掉所述行,则不会发生此错误。)
我无法弄清楚任何原因导致8个vs 9个字符被读取都会导致此错误。有什么想法吗?
以下是我认为相关的两种方法,并对抛出错误的行进行评论。如果您认为其他引用的代码可能导致此问题,请告诉我,我将添加该代码。
-(void)startMenu {
printf("\nGAME OPTIONS\n| WinningScore = %d (w) | Name = %s (n) | Back (b) |\n",
_options.winningScore, [_options.name UTF8String]);
}
-(void)start {
char selectedOption;
char w = 'w';
char n = 'n';
char b = 'b';
while(YES) {
[self startMenu]; // This line gets the EXC_BAD_ACCESS error
// if the user puts in 9 or more characters.
// If it is commented out, then no error is thrown.
scanf("%s", &selectedOption);
if(selectedOption == w) {
[self setWinningScore];
} else if(selectedOption == n) {
[self setName];
} else if(selectedOption == b) {
break;
} else {
printf("'%s' is not a valid option.\n", &selectedOption);
}
}
}
答案 0 :(得分:2)
这是C(并且帖子标记为C)我建议:
char selectedOption;
....
scanf(" %c", &selectedOption);
...
printf("'%c' is not a valid option.\n", selectedOption);
9租船人输入后出现故障是意外发现。 scanf("%s", &selectedOption);
读取单个字符肯定是错误的。任何输入都会导致问题。使用匹配的格式说明符和变量。
[编辑]
类似C的解决方案
如果希望输入超过1 char
,请使用@Devolus提出的想法。示例:
char selectedOption[10];
if (fgets(selectedOption, sizeof selectedOption, stdin) == NULL)
Handle_EOForIOerror();
// Get rid of potential trailing \n if desired.
size_t len = strlen(selectedOption);
if (len > 0 && selectedOption[len-1] == '\n') selectedOption[--len] = '\0';
答案 1 :(得分:1)
您应该在此使用fgets而不是scanf
,因为您可以限制缓冲区中的字符数。
scanf可能不安全,因为可以超出缓冲区。