分段错误和isalpha
Segmentation Fault and isalpha
我想在使用命令行参数和 isalpha()
时澄清我对分段错误的理解,但这种特殊情况让我更加困惑。
所以我按照 SO answer 的建议,宣布 argv[1]
一个 char *
作为绕过它的方法。
但是,如果我使用少于 2 个命令行参数,Segmentation Fault
仍然会出现,并且 isalpha()
在 if 第三个条件
中被忽略
#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()
会被忽略而不是给我一个段错误?
感谢您花时间阅读本文post
当你执行没有参数的程序时,argc
是1
(因为程序名本身算作一个参数),argv[1]
是NULL
。
(argc > 2) || (argc < 1) // Considers argc == 1 and argc == 2 acceptable
应该是
(argc > 2) || (argc < 2) // Only considers argc == 2 acceptable
或者只是
argc != 2
我想在使用命令行参数和 isalpha()
时澄清我对分段错误的理解,但这种特殊情况让我更加困惑。
所以我按照 argv[1]
一个 char *
作为绕过它的方法。
但是,如果我使用少于 2 个命令行参数,Segmentation Fault
仍然会出现,并且 isalpha()
在 if 第三个条件
#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()
会被忽略而不是给我一个段错误?
感谢您花时间阅读本文post
当你执行没有参数的程序时,argc
是1
(因为程序名本身算作一个参数),argv[1]
是NULL
。
(argc > 2) || (argc < 1) // Considers argc == 1 and argc == 2 acceptable
应该是
(argc > 2) || (argc < 2) // Only considers argc == 2 acceptable
或者只是
argc != 2