我希望这能 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,而不是可用于%s
的char
数组零终止的地址。
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] );
}