混淆字符数组元素的类型

时间:2014-06-04 22:00:39

标签: c

我正在努力克服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,并且我从字符数组中为它指定了一个元素。那么为什么整数型投诉呢?

当我运行代码时,它会在同一点发生段错误。

我该如何解决这个问题?

3 个答案:

答案 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开头的字符数组),而不是字符。但valnum_str[len-1]都是字符,因此您应该使用%c代替。

答案 1 :(得分:3)

%s期望一个以空字符结尾的字符串。 val是一个char,因此它是一个单个字符,而不是null终止。

printf会将val解释为指向空终止字符串的指针,但由于val可能不是有效指针,因此会出现未定义的行为并可能发生崩溃。

答案 2 :(得分:0)

%s转换说明符期望其对应的参数具有类型char *,并且该参数指向以0结尾的字符串的开头。

valnum_str[len-1]都有char类型。您正在获取段错误,因为printf正在解释您作为地址传递的字符值。它不是打印1,而是查找从地址0x00000031开始的字符串,该字符串不是有效或可读的地址,因此是段错误。

要打印单个字符值,请使用%c转换说明符。