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;
}