printf %s 段错误 - 为什么?

printf %s segfaulting - why?

我希望这会是 o/p 我的 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;
}

我很困惑为什么 argv[1][a-1] 上的 printf("%s") 会出现段错误。

$ ./a.out Whosebug
Last char of Whosebug : w
Segmentation fault
$ 

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

编辑 1:

感谢指导。 TIL,printf("%s\n", argv[1][a-1]); 是段错误,因为 printf 中的 %s 格式规范期望相应的参数是一个空终止字符数组。

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

printf("%s\n", &argv[1][a-1]);

或者,如:

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

或者,(2) 使用字符:

printf("%c\n", argv[1][a-1]); 

第二个 printf 的格式字符串 "Last char of %s : %s\n" 需要一个指向 null-terminated 字符串的指针作为第二个参数,同时您提供 char。

在第二行你必须写 %c 因为 %s 需要 const char * 参数 你正在通过 const char

 if (a >= 2){
        printf("Last char of %s : %c\n", argv[1], argv[1][a-1] );
        printf("Last char of %s : %c\n", argv[1], argv[1][a-1] );
    } 

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

根据printf

s

If no l modifier is present: The const char * argument is expected to be a pointer to an array of character type (pointer to a string). Characters from the array are written up to (but not including) a terminating null byte ('[=12=]'); if a precision is specified, no more than the number specified are written. If a precision is given, no null byte need be present; if the precision is not specified, or is greater than the size of the array, the array must contain a terminating null byte.

因为 argv[1][a-1] 是一个 char 值,对 %c 没问题,而不是 %s 可用的 char 数组零终止的地址。