C 使用sprintf将整数转换为字符串似乎忽略了0

C 使用sprintf将整数转换为字符串似乎忽略了0,c,string,integer,printf,C,String,Integer,Printf,当我使用输入“01”运行以下代码时,value的值为1,忽略0。但是,如果输入“301”时0不在第一个位置,代码将正常工作 int input; printf("Enter an number: \n"); scanf(" %d", &input); char array[10]; int value = sprintf(array, "%d", input); printf("%d", value); 识别前导'0'数字的一种方法是记录输入的扫描偏移量 int n1, n2; in

当我使用输入“01”运行以下代码时,value的值为1,忽略0。但是,如果输入“301”时0不在第一个位置,代码将正常工作

int input;
printf("Enter an number: \n");
scanf(" %d", &input);

char array[10];
int value = sprintf(array, "%d", input);
printf("%d", value);

识别前导
'0'
数字的一种方法是记录输入的扫描偏移量

int n1, n2;
int input;
if (scanf(" %n%d%n", &n1, &input, &n2) == 1) {
  char array[40];
  int width = n2 - n1;
  int text_length = sprintf(array, "%0*d", width, input); // "0" --> Pad with zeros
                                                       // "*" --> Min width in argument list
  printf("%d <%s>\n", text_length, array);  
}
intn1,n2;
int输入;
如果(扫描频率(“%n%d%n”、&n1、&input、&n2)==1){
字符数组[40];
int宽度=n2-n1;
int text_length=sprintf(数组,“%0*d”,宽度,输入);/“0”->用零填充
//“*”-->参数列表中的最小宽度
printf(“%d\n”,文本长度,数组);
}
将占用前导空格<代码>%n“将记录扫描文本偏移位置<代码>%n“不影响
scanf()
返回值


限制:像
“-123”
“+123”
这样的输入将报告4。

识别前导
'0'
数字的方法是记录输入的扫描偏移量

int n1, n2;
int input;
if (scanf(" %n%d%n", &n1, &input, &n2) == 1) {
  char array[40];
  int width = n2 - n1;
  int text_length = sprintf(array, "%0*d", width, input); // "0" --> Pad with zeros
                                                       // "*" --> Min width in argument list
  printf("%d <%s>\n", text_length, array);  
}
intn1,n2;
int输入;
如果(扫描频率(“%n%d%n”、&n1、&input、&n2)==1){
字符数组[40];
int宽度=n2-n1;
int text_length=sprintf(数组,“%0*d”,宽度,输入);/“0”->用零填充
//“*”-->参数列表中的最小宽度
printf(“%d\n”,文本长度,数组);
}
将占用前导空格<代码>%n“将记录扫描文本偏移位置<代码>%n“不影响
scanf()
返回值


限制:像
“-123”
“+123”
这样的输入将报告4。

sprintf()的手册页上说

sprintf()
,写入字符串
str

这里

sprintf()
int
输入转换为
char数组

例如,如果用户输入的
input
为整数
123
则将其转换为字符数组
123
。现在看来

-------------------------
|  1  |  2  |  3  |  \0  |
-------------------------
array
--------------
|  1  |  \0  |
--------------
array
sprintf()
返回打印的字符数(不包括 用于结束字符串输出的空字节)。这意味着

int value = sprintf(array, "%d", input); /* if input = 123(integer) */
printf("%s: ,%d: \n", array,value);/* array: 123(string), value: 3 */
当我使用输入“01”运行以下代码时,value的值为1,忽略0
input
声明为整数,当用户给出
01
时,则
scanf()
仅将
1
视为前导
0
被忽略,并且只有
1
被存储到
数组中,数组
如下所示

-------------------------
|  1  |  2  |  3  |  \0  |
-------------------------
array
--------------
|  1  |  \0  |
--------------
array
但是,如果输入“301”时0不在第一个位置,代码将正常工作。如果用户输入
301
,则
scanf()
301
存储到
input
中,然后
sprintf()
int
转换为字符数组并存储到
array
中,如
301
所示

     -------------------------
    |  3  |  0  |  1  |  \0  |
    -------------------------
    array

sprintf()的手册页上写着

sprintf()
,写入字符串
str

这里

sprintf()
int
输入转换为
char数组

例如,如果用户输入的
input
为整数
123
则将其转换为字符数组
123
。现在看来

-------------------------
|  1  |  2  |  3  |  \0  |
-------------------------
array
--------------
|  1  |  \0  |
--------------
array
sprintf()
返回打印的字符数(不包括 用于结束字符串输出的空字节)。这意味着

int value = sprintf(array, "%d", input); /* if input = 123(integer) */
printf("%s: ,%d: \n", array,value);/* array: 123(string), value: 3 */
当我使用输入“01”运行以下代码时,value的值为1,忽略0
input
声明为整数,当用户给出
01
时,则
scanf()
仅将
1
视为前导
0
被忽略,并且只有
1
被存储到
数组中,数组
如下所示

-------------------------
|  1  |  2  |  3  |  \0  |
-------------------------
array
--------------
|  1  |  \0  |
--------------
array
但是,如果输入“301”时0不在第一个位置,代码将正常工作。如果用户输入
301
,则
scanf()
301
存储到
input
中,然后
sprintf()
int
转换为字符数组并存储到
array
中,如
301
所示

     -------------------------
    |  3  |  0  |  1  |  \0  |
    -------------------------
    array

使用
%d
格式说明符将字符串作为数字读取时,任何前导零基本上都会丢失

如果要保留前导零,需要将输入读取为字符串。这样您就可以准确地获得用户输入的内容。如果您还想执行数值运算,则可以使用
strtol
获取数值表示

char array[10];
scanf("%s", array);

int input = strtol(array, NULL, 10);
printf("input as number %d, input as string: %s\n", input, array);

使用
%d
格式说明符将字符串作为数字读取时,任何前导零基本上都会丢失

如果要保留前导零,需要将输入读取为字符串。这样您就可以准确地获得用户输入的内容。如果您还想执行数值运算,则可以使用
strtol
获取数值表示

char array[10];
scanf("%s", array);

int input = strtol(array, NULL, 10);
printf("input as number %d, input as string: %s\n", input, array);

这是一个int,不是字符串。这是意料之中的。
scanf()
01
1
转换为相同的位模式(一组零位和最后一位)
sprintf()无法判断转换的文本中有多少前导零(如果确实转换了任何文本)。注意,在源代码中,
0777
777
产生非常不同的值;第一个是八进制常数,第二个是十进制常数。使用
scanf(“%d”,…)进行十进制输入,前导零被忽略;使用
scanf(“%i”,…)
,前导零很重要(它又是八进制)。@Ben被
01
转换成一个不同的整数,然后
1
?转换为int时,
01
精确值是多少?如果要读取前导零,最好的选择是将数字作为字符串读入,然后将输入保存到字符数组,而不是int。您对数字的整数值不感兴趣