objective-c - EXC_BAD_ACCESS 读取 9 个字符时,但小于 9 个字符时有效

标签 objective-c c exc-bad-access

我正在使用 Objective-C 开发控制台应用程序。我已经让它工作了,但是在手动测试边缘情况时,我发现了一个我无法解释的奇怪行为。

基本上,我在循环中设置了 scanf(),当用户键入无效信息时,它会打印一条“无效选项”消息。然后,如果输入的长度少于 9 个字符,它将按预期再次进行循环。但是,如果输入是 9 个字符或更长,它会在某一行给出 EXC_BAD_ACCESS 错误。
(如果我注释掉该行,则不会发生此错误。)
我想不通读取 8 对 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);
        }
    }
}

最佳答案

如果这是 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';

关于objective-c - EXC_BAD_ACCESS 读取 9 个字符时,但小于 9 个字符时有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20979083/

相关文章:

c++ - OpenCV 导致 EXC_BAD_ACCESS 线程 1 : code=2 crashes in UIApplicationMain

ios - EXC_BAD_ACCESS 和 MPMusicPlayerController

javascript - 绕过WebView跨域安全

c - 函数根据数字删除单词 - C 编程

c - 头文件未正确包含

C - int 数组到 char* 的转换

iphone - 搜索栏的 iOS 色调文本字段背景

部署后 iOS 共享扩展不起作用

iphone - 如果不是链接,如何检测 UIWebView 上的点击

objective-c - Objective C - [NSArray count] 上的 EXC_BAD_ACCESS 但看不到如何