C、为什么会出现Segmentation fault(core dumped)
C, Why there is a Segmentation fault (core dumped)
#include <cs50.h>
#include <stdio.h>
#include<ctype.h>
int main(int argc, string argv[])
{
int KEY;
if(isdigit(argv[1]))
{
KEY = (int)argv[1];
}
else
{
printf("Usage: ./caesar key");
}
printf("\n");
printf("%i\n",argc);
}
当我输入以下内容时,我找不到问题
我该如何解决?
这不是一种具有各种语法糖功能的 high-level 语言。
重要提示:
const char *
到 int
的转换不只是 type-casting 它完成的。
isdigit()
仅适用于 int
(单个字符),不适用于 const char *
它将导致 Undefined Behavior.
argc
是指针数组的长度argv
string
不是 main()
函数参数的有效类型,它应该是 int main(int argc, char const **argv) { }
- 必须检查
argv[1]
是否存在
- 一旦你打印出你的程序应该退出的用法
- 任何错误消息都应打印在
stderr
上
- 退出应用程序时必须使用
return EXIT_SUCCESS;
,它在头文件stdlib.h
中定义,否则如果出现问题则使用return EXIT_FAILURE;
。
最终代码
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int main(int argc, char const **argv)
{
if(argc == 1)
{
fprintf(stderr, "Usage: %s <KEY>", argv[0]);
return EXIT_FAILURE;
}
for(size_t i = 0; argv[1][i]; i++)
{
if(!isdigit(argv[1][i]))
{
fprintf(stderr, "expected only integer value\n");
return EXIT_FAILURE;
}
}
// we don't need to check whether `argv[1]` is all digit or not at this point
int KEY = strtod(argv[1], NULL);
printf("argc = %d\n", argc);
printf("KEY = %d\n", KEY);
return EXIT_SUCCESS;
}
#include <cs50.h>
#include <stdio.h>
#include<ctype.h>
int main(int argc, string argv[])
{
int KEY;
if(isdigit(argv[1]))
{
KEY = (int)argv[1];
}
else
{
printf("Usage: ./caesar key");
}
printf("\n");
printf("%i\n",argc);
}
当我输入以下内容时,我找不到问题
我该如何解决?
这不是一种具有各种语法糖功能的 high-level 语言。
重要提示:
const char *
到int
的转换不只是 type-casting 它完成的。isdigit()
仅适用于int
(单个字符),不适用于const char *
它将导致 Undefined Behavior.argc
是指针数组的长度argv
string
不是main()
函数参数的有效类型,它应该是int main(int argc, char const **argv) { }
- 必须检查
argv[1]
是否存在 - 一旦你打印出你的程序应该退出的用法
- 任何错误消息都应打印在
stderr
上
- 退出应用程序时必须使用
return EXIT_SUCCESS;
,它在头文件stdlib.h
中定义,否则如果出现问题则使用return EXIT_FAILURE;
。
最终代码
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int main(int argc, char const **argv)
{
if(argc == 1)
{
fprintf(stderr, "Usage: %s <KEY>", argv[0]);
return EXIT_FAILURE;
}
for(size_t i = 0; argv[1][i]; i++)
{
if(!isdigit(argv[1][i]))
{
fprintf(stderr, "expected only integer value\n");
return EXIT_FAILURE;
}
}
// we don't need to check whether `argv[1]` is all digit or not at this point
int KEY = strtod(argv[1], NULL);
printf("argc = %d\n", argc);
printf("KEY = %d\n", KEY);
return EXIT_SUCCESS;
}