Objective c EXC_读取9个字符时访问错误,但使用少于9个字符

Objective c EXC_读取9个字符时访问错误,但使用少于9个字符,objective-c,c,exc-bad-access,Objective C,C,Exc Bad Access,我正在Objective-C中开发一个控制台应用程序。我已经让它工作了,但是当手动测试边缘案例时,我发现了一个我无法解释的奇怪行为 基本上,我在循环中设置了scanf(),当用户输入无效信息时,它会打印一条“invalid option”消息。然后,如果输入长度小于9个字符,它将按照预期再次通过循环。但是,如果输入为9个字符或更长,则在某一行上会出现EXC_BAD_访问错误。(如果我对所述行进行注释,则不会发生此错误。)我无法找出读取8个或9个字符会导致此错误的任何原因。有什么想法吗 下面是我认

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

基本上,我在循环中设置了scanf(),当用户输入无效信息时,它会打印一条“invalid option”消息。然后,如果输入长度小于9个字符,它将按照预期再次通过循环。但是,如果输入为9个字符或更长,则在某一行上会出现EXC_BAD_访问错误。
(如果我对所述行进行注释,则不会发生此错误。)
我无法找出读取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);
        }
    }
}
您应该在此处使用而不是
scanf
,因为您可以限制缓冲区中的字符数

scanf可能不安全,因为可能会超出缓冲区。

您应该在此处使用而不是
scanf
,因为您可以限制缓冲区中的字符数

scanf可能不安全,因为可能会超出缓冲区。

您应该在此处使用而不是
scanf
,因为您可以限制缓冲区中的字符数

scanf可能不安全,因为可能会超出缓冲区。

您应该在此处使用而不是
scanf
,因为您可以限制缓冲区中的字符数

scanf可能不安全,因为缓冲区可能会被超出。

如果这是C(帖子被标记为C),我建议:

char selectedOption;
....
scanf(" %c", &selectedOption);
...
printf("'%c' is not a valid option.\n", selectedOption);

在9号租船人输入后出现的故障是意外发现<代码>扫描(“%s”,选择选项(&s)读取单个字符肯定是错误的。任何输入都会导致问题。使用匹配的格式说明符和变量


[编辑]
类似C的解决方案。
如果需要输入超过1个字符,请使用@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';
这是C(帖子的标签是C),我建议:

char selectedOption;
....
scanf(" %c", &selectedOption);
...
printf("'%c' is not a valid option.\n", selectedOption);

在9号租船人输入后出现的故障是意外发现<代码>扫描(“%s”,选择选项(&s)读取单个字符肯定是错误的。任何输入都会导致问题。使用匹配的格式说明符和变量


[编辑]
类似C的解决方案。
如果需要输入超过1个字符,请使用@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';
这是C(帖子的标签是C),我建议:

char selectedOption;
....
scanf(" %c", &selectedOption);
...
printf("'%c' is not a valid option.\n", selectedOption);

在9号租船人输入后出现的故障是意外发现<代码>扫描(“%s”,选择选项(&s)读取单个字符肯定是错误的。任何输入都会导致问题。使用匹配的格式说明符和变量


[编辑]
类似C的解决方案。
如果需要输入超过1个字符,请使用@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';
这是C(帖子的标签是C),我建议:

char selectedOption;
....
scanf(" %c", &selectedOption);
...
printf("'%c' is not a valid option.\n", selectedOption);

在9号租船人输入后出现的故障是意外发现<代码>扫描(“%s”,选择选项(&s)读取单个字符肯定是错误的。任何输入都会导致问题。使用匹配的格式说明符和变量


[编辑]
类似C的解决方案。
如果需要输入超过1个字符,请使用@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';

char selectedOption
char selectedOption
char selectedOption
char selectedOption