簡體   English   中英

printf%s segfaulting - 為什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM