C printf%s分段错误-为什么?
我希望这是我的argv[1]的最后一封信: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){
$ 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])由于printf中的%s格式规范要求相应的参数为以null结尾的字符数组,因此代码>出现分段错误
(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] );
}