Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C printf%s分段错误-为什么?_C_Segmentation Fault_Format Specifiers - Fatal编程技术网

C printf%s分段错误-为什么?

C printf%s分段错误-为什么?,c,segmentation-fault,format-specifiers,C,Segmentation Fault,Format Specifiers,我希望这是我的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){

我希望这是我的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;
}
感谢您的时间和专业知识

编辑1:

谢谢你的指导。直到,
printf(“%s\n”,argv[1][a-1])出现分段错误

(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]); 

第二次打印的格式字符串f
“%s的最后一个字符:%s\n”
在提供字符时需要一个指向以null结尾的字符串的指针作为第二个参数。

在第二行中必须写入
%c
,因为
%s
需要
常量字符*
参数 您正在传递
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
打印字符

根据:

s

如果不存在l修饰符:应使用const char*参数 作为指向字符类型数组的指针(指向字符串的指针)。 数组中的字符最多写入(但不包括)一个 终止空字节('\0');如果指定了精度,则不再指定 比指定的数字还多。如果给定了精度,则没有 空字节需要存在;如果未指定精度,或 大于数组的大小,数组必须包含 终止空字节


因为
argv[1][a-1]
是一个
char
值,所以
%c
可以,而不是
char
数组的地址,零终止可用于
%s

使用不正确的格式说明符(
%s
在这种情况下)是未定义的行为。如果要使用
%s
打印最后一个字母,请传递一个指针(我看到的4个答案中没有一个表明这一点):`printf(“%s的最后一个字符:%s\n”,argv[1],&argv[1][a-1])是什么让你认为你可以用两个不同的说明符打印同一类型的变量?如果你想从地址
'w'
中读取,你还希望得到什么?你可能还没有启用你应该启用的所有警告-好的编译器会帮你发现不匹配的地方。对于GCC,请尝试
-Wall-Wextra-Wwrite strings-Wno括号-Wpedantic-Warray bounds
对于初学者(
-Wall-Wextra
打开
-Wformat
,这正是您需要的)。
 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] );
    }