【发布时间】:2018-03-16 06:07:01
【问题描述】:
我希望这会 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 stackoverflow
Last char of stackoverflow : 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]);
【问题讨论】:
-
使用不正确的格式说明符(在这种情况下为
%s)是未定义的行为。 -
如果您想使用
%s打印最后一个字母,请传递一个指针(我看到的 4 个答案都没有建议):` printf("Last char of %s : %s\n ", argv[1], &argv[1][a-1]);` -
是什么让您认为可以使用两个不同的说明符打印相同类型的变量?
-
如果您想从地址
'w'读取,您还有什么期望? -
你可能没有启用所有你应该启用的警告——好的编译器会帮助你发现这里的不匹配。对于 GCC,请尝试
-Wall -Wextra -Wwrite-strings -Wno-parentheses -Wpedantic -Warray-bounds作为初学者(-Wall -Wextra开启-Wformat,这是您需要的)。
标签: c segmentation-fault format-specifiers