为什么我的输出错误? C新手
Why is my output wrong? C newbie
#include <stdio.h>
int main(void)
{
char username;
username = '10A';
printf("%c\n", username);
return 0;
}
我刚开始学C,这是我的第一个问题。为什么这个程序给我2个警告(多字符常量,隐式常量转换溢出)?
而不是 10A
作为输出,它只给出 A
.
您正试图将多个字符填充到一组 ''
和单个 char
变量中。您需要 ""
作为字符串文字,并且您需要一个字符数组来保存一个字符串。要打印字符串,请使用 %s
.
将所有这些放在一起,您将得到:
#include <stdio.h>
int main(void)
{
char username[] = "10A";
printf("%s\n", username);
return 0;
}
脚注
来自 Jonathan Leffler 的以下关于多字符常量的评论:
请注意,多字符常量是 C 的一部分(因此是警告,而不是错误),但多字符常量的值是实现定义的,因此不可移植。它是一个整数值;它大于一个字符,因此您会收到该警告。您几乎可以得到任何输出 — 1、A 和一个空字节都可能是合理的。
'10A'
是一种允许但模糊的定义值的方式。
在 int
变量的情况下,
int username = '10A';
printf("%x\n", username);
会输出
313041
这些是一对十六进制值 - 每对是
0x31
是您输入的 '1'
。
0x30
是您输入的 '0'
。
0x41
是您输入的 'A'
。
但是 char
类型不能容纳这个。
在 C 中没有 String 对象。相反,字符串是字符数组(后跟一个空字符)。其他答案已指出静态分配此内存。但是我建议动态分配字符串。请记住 C 缺少垃圾内存收集器(就像 java 中那样)。所以记得释放你的指针。玩得开心!!
您可以使用char *username
指向地址的开头并循环遍历之后的内存。例如,使用 sizeof(username)
获取大小,然后循环 printf 直到打印出用户名中的字符数。然而,如果你不小心,你可能会遇到重大问题......
#include <stdio.h>
int main(void)
{
char username;
username = '10A';
printf("%c\n", username);
return 0;
}
我刚开始学C,这是我的第一个问题。为什么这个程序给我2个警告(多字符常量,隐式常量转换溢出)?
而不是 10A
作为输出,它只给出 A
.
您正试图将多个字符填充到一组 ''
和单个 char
变量中。您需要 ""
作为字符串文字,并且您需要一个字符数组来保存一个字符串。要打印字符串,请使用 %s
.
将所有这些放在一起,您将得到:
#include <stdio.h>
int main(void)
{
char username[] = "10A";
printf("%s\n", username);
return 0;
}
脚注
来自 Jonathan Leffler 的以下关于多字符常量的评论:
请注意,多字符常量是 C 的一部分(因此是警告,而不是错误),但多字符常量的值是实现定义的,因此不可移植。它是一个整数值;它大于一个字符,因此您会收到该警告。您几乎可以得到任何输出 — 1、A 和一个空字节都可能是合理的。
'10A'
是一种允许但模糊的定义值的方式。
在 int
变量的情况下,
int username = '10A';
printf("%x\n", username);
会输出
313041
这些是一对十六进制值 - 每对是
0x31
是您输入的 '1'
。
0x30
是您输入的 '0'
。
0x41
是您输入的 'A'
。
但是 char
类型不能容纳这个。
在 C 中没有 String 对象。相反,字符串是字符数组(后跟一个空字符)。其他答案已指出静态分配此内存。但是我建议动态分配字符串。请记住 C 缺少垃圾内存收集器(就像 java 中那样)。所以记得释放你的指针。玩得开心!!
您可以使用char *username
指向地址的开头并循环遍历之后的内存。例如,使用 sizeof(username)
获取大小,然后循环 printf 直到打印出用户名中的字符数。然而,如果你不小心,你可能会遇到重大问题......