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

时间:2018-10-30 16:54:33

标签: c string integer printf

当我使用“ 01”的输入运行以下代码时,value的值为1,忽略了0。但是,如果我输入0不在第一个位置的“ 301”,则该代码有效。

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

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

3 个答案:

答案 0 :(得分:2)

辨别前'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);  
}

" "将消耗前导空白。 "%n"将记录扫描文本的偏移位置。 "%n"scanf()返回值没有贡献。

限制:"-123""+123"之类的输入将报告4。

答案 1 :(得分:1)

sprintf()的手册页上说

int sprintf(char *str, const char *format, ...);
     

sprintf(),写入字符串str

这里

int value = sprintf(array, "%d", input);

sprintf()将输入int转换为char array

例如,如果用户输入input作为整数123,它将转换为char数组123。现在看起来像

-------------------------
|  1  |  2  |  3  |  \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被存储到array中,array看起来像

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

但是,如果我输入0不在第一个位置时输入“ 301”,则代码有效。如果用户输入了301,则scanf()301存储到inputsprintf()将该int转换为char数组,并像array一样存储到301中,如

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

答案 2 :(得分:0)

使用%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);