我正在努力克服C字符数组的元素类型。
char get_final (char *num_str)
{
int len = strlen(num_str);
char val;
val = num_str[len-1];
printf("the number is %s\n", num_str);
printf("the length is %d\n", len);
printf("the last digit is %s\n", val);
printf("the last digit is %s\n", num_str[len-1]);
return val;
}
int main() {
char num[4] = "123";
int last;
last = get_final(num);
printf("final: the last digit is %d\n", last);
}
当我编译它时,我得到一个警告,打印函数中最后一个数字,格式%s期望一个char,但是我给它一个int。但是我已经将变量val声明为char,并且我从字符数组中为它指定了一个元素。那么为什么整数型投诉呢?
当我运行代码时,它会在同一点发生段错误。
我该如何解决这个问题?
答案 0 :(得分:4)
替换
printf("the last digit is %s\n", val);
printf("the last digit is %s\n", num_str[len-1]);
与
printf("the last digit is %c\n", val);
printf("the last digit is %c\n", num_str[len-1]);
将%s
放在printf
中,您说要打印一个字符串(由char *
指向的以0开头的字符数组),而不是字符。但val
和num_str[len-1]
都是字符,因此您应该使用%c
代替。
答案 1 :(得分:3)
%s
期望一个以空字符结尾的字符串。 val
是一个char,因此它是一个单个字符,而不是null终止。
printf
会将val
解释为指向空终止字符串的指针,但由于val
可能不是有效指针,因此会出现未定义的行为并可能发生崩溃。
答案 2 :(得分:0)
%s
转换说明符期望其对应的参数具有类型char *
,并且该参数指向以0结尾的字符串的开头。
val
和num_str[len-1]
都有char
类型。您正在获取段错误,因为printf
正在解释您作为地址传递的字符值。它不是打印1
,而是查找从地址0x00000031
开始的字符串,该字符串不是有效或可读的地址,因此是段错误。
要打印单个字符值,请使用%c
转换说明符。