[英]printf %s segfaulting - why?
我希望這會是我的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;
}
我很困惑為什么printf(“%s”)在argv [1] [a-1] segfaulting上。
$ ./a.out stackoverflow
Last char of stackoverflow : w
Segmentation fault
$
感謝您的時間和專業知識!
編輯1:
感謝您的指導。 TIL, printf("%s\\n", argv[1][a-1]);
是segfaulting,因為printf中的%s格式規范要求相應的參數是一個空終止的char數組。
或者, (1)傳遞一個指針:
printf("%s\n", &argv[1][a-1]);
或者,如:
char *ptr = argv[1];
printf("%s\n", &ptr[a-1]);
或者, (2)使用char:
printf("%c\n", argv[1][a-1]);
因為%s
格式說明符用於字符串,但您嘗試使用%s
打印字符。
根據printf :
小號
如果不存在l修飾符:const char *參數應該是指向字符類型數組(指向字符串的指針)的指針 。 數組中的字符被寫入(但不包括)終止空字節('\\ 0'); 如果指定了精度,則不會寫入指定的數量。 如果給出精度,則不需要存在空字節; 如果未指定精度,或者大於數組的大小,則數組必須包含終止空字節。
因為argv[1][a-1]
是一個char
值,對於%c
是好的,而不是char
數組的地址零終止可用於%s
。
第二個printf的格式字符串"Last char of %s : %s\\n"
需要一個指向以null結尾的字符串的指針作為第二個參數,同時提供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] );
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.