为什么我的输出错了? C新手

时间:2018-06-05 21:14:28

标签: c gcc gcc-warning

#include <stdio.h>
int main(void) 
{
    char username;
    username = '10A';
    printf("%c\n", username);
    return 0;
}

我刚开始学习C,这是我的第一个问题。为什么这个程序给我2个警告(多字符常量,隐式常量转换溢出)?

而不是将10A作为输出,而是仅提供A

4 个答案:

答案 0 :(得分:4)

您正在尝试将多个字符填充到一组''和一个char变量中。对于字符串文字,您需要"",并且您需要一个字符数组来保存字符串。要打印字符串,请使用%s

将所有这些放在一起,你得到:

#include <stdio.h>
int main(void) 
{
    char username[] = "10A";
    printf("%s\n", username);
    return 0;
}

<强>脚注

以下关于多字符常量的评论中的Jonathan Leffler:

请注意,多字符常量是C的一部分(因此是警告,而不是错误),但多字符常量的值是实现定义的,因此不可移植。它是一个整数值;它大于适合char,所以你得到那个警告。你可能已经得到了几乎任何东西作为输出 - 1,A和一个空字节都可能是合理的。

答案 1 :(得分:1)

'10A'是一种允许但不明确的定义值的方法。

如果是int变量,

int username = '10A';
printf("%x\n", username);

将输出

313041

这些是十六进制值对 - 每对都是

0x31是您输入的'1'

0x30是您输入的'0'

0x41是您输入的'A'

但是char类型无法解决此问题。

答案 2 :(得分:1)

在C中没有String对象。相反,字符串是字符数组(后跟空字符)。其他答案已经指出静态分配这个内存。但是我建议动态分配字符串。记住C缺少一个垃圾内存收集器(就像在java中一样)。所以记得释放你的指针。玩得开心!!

答案 3 :(得分:0)

您可以使用char *username指向地址的开头并在之后循环通过内存。例如,使用sizeof(username)来获取大小,然后循环printf,直到您在用户名中打印了字符数量。但是,如果你不小心,你可能会遇到重大问题......