c-使用scanf()将数字解析为数字

  • 本文关键字:数字 使用 scanf scanf
  • 更新时间 :
  • 英文 :


我想键入一个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。

您将获得字符12的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]);

相关内容

  • 没有找到相关文章

最新更新