【问题标题】:Using sprintf to convert integer to string seems to ignore 0使用 sprintf 将整数转换为字符串似乎忽略了 0
【发布时间】:2019-04-03 18:57:08
【问题描述】:

当我使用输入“01”运行以下代码时,值的值为 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);

【问题讨论】:

  • 它是一个 int,而不是一个字符串。
  • 这是意料之中的。 scanf()011 转换为相同的位模式(一堆零位和最后一个位) - 而 sprintf() 无法判断转换后的文本中有多少前导零(如果,确实,任何文本都被转换了)。请注意,在源代码中,0777777 产生非常不同的值;第一个是八进制常数,第二个是十进制常数。在带有scanf("%d", …); 的十进制输入中,前导零被忽略;对于scanf("%i", …);,前导零很重要(它又是八进制)。
  • @Ben 01 是否转换为与 1 不同的整数?转换为 int 时,01exact value 是什么?
  • 如果要读取前导零,最好的选择是将数字作为字符串读取
  • 然后将输入保存到 char 数组,而不是 int。您对数字的整数值不感兴趣,而是对位置的每个值感兴趣。这是另一个问题。您发布了sprintf seems to ignore 0。你想要how to use scanf to extract all numbers by their position in string

标签: c string integer printf


【解决方案1】:

识别前导'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。

【讨论】:

  • 注意 widthtext_length 在这种情况下应该是相同的,除非出现罕见打印错误。
【解决方案2】:

sprintf() 的手册页说

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

sprintf(),写入字符串str

这里

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

sprintf()int 输入转换为char array

例如,如果用户将 input 输入为整数 123,它会将其转换为字符数组 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”运行以下代码时,值的值为 1,忽略 0。? input 被声明为整数,当用户给出 @987654336 @ 然后scanf() 仅将1 视为前导0 被忽略,并且只有1 被存储到array 中,array 看起来像

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

但是,如果我输入 '301' 而 0 不在第一个位置,则代码有效。 如果用户输入 301,则 scanf()301 存储到 input 和 @987654348 @ 将 int 转换为 char 数组并存储到 array301 like

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-01
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-21
      • 1970-01-01
      相关资源
      最近更新 更多