C - printf %s 段错误 - 为什么



我希望这能 o/p 我的 argv[1] 的最后一个字母:

$ cat input_string_fu.c 
#include <stdio.h>
int main(int argc, char *argv[])
{
    if (argc !=2){
       printf("Error: Invalid syntaxn");
       return 1;
    };
    int a;
    a = strlen(argv[1]);
    if (a >= 2){
        printf("Last char of %s : %cn", argv[1], argv[1][a-1] );
        printf("Last char of %s : %sn", argv[1], argv[1][a-1] );
    } 
    return 0;
}

我很困惑为什么 printf("%s"( 在 argv[1][a-1] 段错误上。

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

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

编辑 1:

感谢您的指导。TIL,printf("%sn", argv[1][a-1]);段错误,因为 printf 中的 %s 格式规范期望相应的参数是以空结尾的字符数组。

(1( 传递指针:

printf("%sn", &argv[1][a-1]);

或者,作为:

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

或者,(2( 使用字符:

printf("%cn", argv[1][a-1]); 

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

根据printf:

s

如果不存在 l 修饰符:需要常量字符 * 参数 作为指向字符类型数组(指向字符串的指针(的指针。 数组中的字符最多写入(但不包括(a 终止空字节 ('\0'(;如果指定了精度,则不再 比写入指定的数字。如果给定精度,则否 需要存在空字节;如果未指定精度,或者 大于数组的大小,数组必须包含 终止空字节。

因为argv[1][a-1]是一个char值,所以对于%c来说OK,而不是可用于%schar数组零终止的地址。

第二个

printf 的格式字符串"Last char of %s : %sn"在提供 char 时需要一个指向以 null 结尾的字符串作为第二个参数的指针。

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

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

相关内容

  • 没有找到相关文章