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
数组零终止的地址。
我希望这会是 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
数组零终止的地址。