我想键入一个10位数的数字,然后将这些数字放入一个数组中。但出于某种原因,我得到了这个随机的2位数,似乎与我的输入(??)无关。
char number[10]; //number containing 10 digits
scanf("%s",number); //store digits of number
printf("%dn",number[0]); //print the 1st digit in the number
printf("%dn",number[1]); //print the 2nd digit in the number
这是我得到的:
Input:
1234567890
Output:
49
50
实际上,49应该是1,50应该是2。
您将获得字符1
和2
的ASCII值。使用%c
说明符打印数字。
printf("%cn",number[0]);
警告您的代码可能会调用未定义的行为
但我们稍后再谈。让我们先解决您的实际问题。
以下是对发生的事情的逐步解释。首先你需要知道的是,C中的每个字符实际上都是编译器的整数。
试试这个代码。
#include <stdio.h>
int main()
{
printf("%dn", sizeof '1');
return 0;
}
输出为:
4
这表明编译器将字符文字'1'
表示为4字节整数。现在,让我们看看'1'
的这个4字节整数是什么,使用下面的代码。
#include <stdio.h>
int main()
{
int a = '1';
printf("a when intepreted as int : %dn", a);
printf("a when intepreted as char: %cn", a);
return 0;
}
编译并运行它。你会看到这个输出。
a when intepreted as int : 49
a when intepreted as char: 1
我们学到了什么?
字符'1'
在我的系统中表示为整数49
。你的系统也是如此。这是因为在我的系统和您的系统中,编译器对整数使用ASCII码,其中'1'
是49,'2'
是50,'A'
是65,'B'
是66,依此类推。请注意,对于其他系统,字符到这些代码的映射可能不同。您永远不应该依赖这些整数代码来识别字符。
因此,当我尝试将这个值打印为整数(使用%d
作为格式说明符)时,打印的是'1'
的整数值,即49
。但是,如果我们将该值打印为字符(使用%c
作为格式说明符),则打印的是整数代码为49的字符。换句话说,1
被打印出来。
现在试试这个代码。
#include <stdio.h>
int main()
{
char s[] = "ABC123";
int i;
printf("char %%d %%cn");
printf("---- -- --n");
for (i = 0; i < 6; i++) {
printf("s[%d] %d %cn", i, s[i], s[i]);
}
return 0;
}
现在您应该看到这个输出了。
char %d %c
---- -- --
s[0] 65 A
s[1] 66 B
s[2] 67 C
s[3] 49 1
s[4] 50 2
s[5] 51 3
现在说得通吗?当您想要打印字符时,需要使用%c
格式说明符。只有当您想要查看表示该字符的整数代码时,才应该使用%d
。
最后,让我们回到您的代码。这就是你修复它的方法。
#include <stdio.h>
int main()
{
char number[10];
scanf("%9[^n]", number);
printf("%cn", number[0]);
printf("%cn", number[1]);
return 0;
}
有两件事需要注意。
- 我使用
%c
作为格式说明符来打印读取的数字的字符表示 - 我已经更改了
scanf
的格式说明符,使其最多只能接受9个字符,而这些字符不是换行符。这是为了确保用户不会因为输入的字符串远远超过9个字符而导致程序崩溃。为什么是9而不是10?。因为我们需要为null终止符保留数组中的一个单元格为空。较长的输入将覆盖超过为number
阵列分配的10个字节的存储器位置。这种缓冲区溢出会导致代码调用未定义的行为,这可能会导致崩溃或杀死你的猫
printf("%cn",number[0]); //print the 1st digit in the number
printf("%cn",number[1]);
应该为你做这项工作,你看到的是ascii值。
您的number
数组是一个char数组,因此它的每个元素都是char。键入时:printf("%dn",number[0]);
您将字符打印为整数,因此您可以获得每个字符的ASCII代码。
将您的语句更改为printf("%cn",number[0]);
以将字符打印为字符,而不是打印为int
警告您的代码调用未定义的行为
char number[10]; // Can only store 9 digits and nul character
scanf("%s",number); // Inputting 1234567890 (11 chars) will overflow the array!
改为使用fgets
:
#define MAX_LEN 10
char number[MAX_LEN];
if(fgets(number, MAX_LEN, stdin)) {
// all went ok
}
一旦解决了这个问题,就可以解决打印问题。您打印的是字符代码(数字),而不是实际字符。使用不同的类型说明符:
printf("%cn",number[0]);