【发布时间】:2020-12-31 19:37:35
【问题描述】:
我想在使用命令行参数和isalpha() 时澄清我对分段错误的理解,但这种特殊情况让我更加困惑。
所以我宣布 argv[1] 和 char * 是一种解决方法,正如 this SO answer所建议的那样。
但是,如果我使用的命令行参数少于 2 个,Segmentation Fault 仍然会出现,并且 isalpha() 在 if 3rd 条件中被忽略
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h> //atoi is here
int main(int argc, char* argv[]){
char *input = argv[1];
// Error handling
if ((argc > 2) || (argc < 1) || (isalpha(input[1])))
{
printf("Unwanted input\n");
return 1;
}
return 0;
}
为什么我在不使用命令行参数时得到undefined behaviour,为什么isalpha() 会被忽略而不是给我一个段错误?
感谢您花时间阅读这篇文章
【问题讨论】:
-
不提供参数时会出现段错误,因为在这种情况下,argc 为 1; argv[1] 为 NULL,而 NULL[1] 是未定义的行为,通常是段错误(因此永远不会调用 isalpha,因为它的参数无法计算)。
-
char *input = argv[1];应该在您检查argc > 1之后,而不是之前。顺便说一句,我不建议对char *进行类型定义。只是明确而不是隐藏指针。 -
string来自哪里? -
@alk 可能来自一个未说明的
#include <cs50.h>,在这种情况下,它是typedefforchar* -
@rici。感谢您的回答!
isalpha()即使在解决了段错误之后仍然什么都不做。我什至尝试将它放在单独的if else语句中。else if (isalpha(input[1])) { printf("Not accepting alphabet\n"); }
标签: c segmentation-fault command-line-arguments isalpha