当我使用“ 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);
答案 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
存储到input
和sprintf()
将该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);