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