printf%s segfaulting - 为什么?

str*_*ner 2 c segmentation-fault format-specifiers

我希望这会是我的argv的最后一个字母[1]:

$ cat input_string_fu.c 
#include <stdio.h>

int main(int argc, char *argv[])
{
    if (argc !=2){
       printf("Error: Invalid syntax\n");
       return 1;
    };

    int a;
    a = strlen(argv[1]);
    if (a >= 2){
        printf("Last char of %s : %c\n", argv[1], argv[1][a-1] );
        printf("Last char of %s : %s\n", argv[1], argv[1][a-1] );
    } 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我很困惑为什么printf("%s")在argv [1] [a-1] segfaulting上.

$ ./a.out stackoverflow
Last char of stackoverflow : w
Segmentation fault
$ 
Run Code Online (Sandbox Code Playgroud)

感谢您的时间和专业知识!

编辑1:

感谢您的指导.TIL,printf("%s\n", argv[1][a-1]);是segfaulting,因为printf中的%s格式规范要求相应的参数是一个空终止的char数组.

或者,(1)传递一个指针:

printf("%s\n", &argv[1][a-1]);
Run Code Online (Sandbox Code Playgroud)

或者,如:

char *ptr = argv[1];
printf("%s\n", &ptr[a-1]);
Run Code Online (Sandbox Code Playgroud)

或者,(2)使用char:

printf("%c\n", argv[1][a-1]); 
Run Code Online (Sandbox Code Playgroud)

msc*_*msc 5

因为%s格式说明符用于字符串,但您正在尝试使用打印字符%s.

根据printf:

小号

如果不存在l修饰符:const char*参数应该是指向字符类型数组(指向字符串的指针)的指针.数组中的字符被写入(但不包括)终止空字节('\ 0'); 如果指定了精度,则不会写入指定的数量.如果给出精度,则不需要存在空字节; 如果未指定精度,或者大于数组的大小,则数组必须包含终止空字节.