gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:21:55 24 4
gpt4 key购买 nike

我正在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com