【问题标题】:Displaying an int in a char, with some modifications在 char 中显示 int,并进行一些修改
【发布时间】:2012-12-05 23:49:04
【问题描述】:

我目前正在将一个 Csharp 程序转换为 Unix C。它运行良好,除了:

我有一个包含秒数的整数(秒),出于美学原因,我想用前零(1->01 等)显示。我编写的代码如下,它有时有效,有时无效,具体取决于它的调用位置。我怀疑问题出在指针上。

char *st_str;
if(secs<10)
{
   if(secs==0) st_str = "00";
   else if(secs==1) st_str = "01";
   else if(secs==2) st_str = "02";
   else if(secs==3) st_str = "03";
   else if(secs==4) st_str = "04";
   else if(secs==5) st_str = "05";
   else if(secs==6) st_str = "06";
   else if(secs==7) st_str = "07";
   else if(secs==8) st_str = "08";
   else if(secs==9) st_str = "09";
}
else
{
   sprintf(st_str,"%i",secs);
}

【问题讨论】:

    标签: c string pointers char printf


    【解决方案1】:

    为什么要将它转换为字符串。 printf可以用padding显示数字

    例如。

    int secs;
    
    for(secs = 0; secs < 60; ++secs)
        printf("%02d\n", secs);
    

    或者如果你想要它在一个字符串中

    char s[20];
    snprintf(s, 20,"%02d", secs);
    

    【讨论】:

    • 我觉得应该是&lt;=59
    【解决方案2】:

    在下面使用这个:

    if(secs >=0 && secs < 10)
     sprintf(st_str,"0%d",secs);
    else
     sprintf(st_str,"%d",secs);
    

    或者,如果您只想显示使用 printf("%02d",secs) 并直接将其打印到输出屏幕。

    编辑:但请记住,在 sprintf 的情况下,您必须为 st_str 分配内存以保持 secs 的值。

    【讨论】:

      【解决方案3】:

      要打印最少n 位,您可以使用格式化程序中的精度点,如下所示:

      printf("%.2d", secs);

      您不需要创建字符变量等!

      【讨论】:

        【解决方案4】:

        您可以将零放在格式字符串中并使用sprintf(...)

        sprintf(st_str,"0%d",secs);
        

        现在请注意,由于您可以在同一语句中概括从 0 到 9 的所有秒数,因此 switch 语句可能更合适:

        str_str = malloc(<max-digits-here>);
        
        switch(secs) 
        {
           case 0:
           case 1:
           case 2:
           case 3:
           case 4:
           case 5:
           case 6:
           case 7:
           case 8:
           case 9:
              sprintf(st_str,"0%d",secs);
              break;
           default:
              sprintf(st_str,"%d",secs);
        }
        

        【讨论】:

          【解决方案5】:

          如果你想 sprintf() 到 st_str,你必须为它分配内存。但是,您提出的代码绝对是多余的。为什么不直接使用%02d 格式说明符?另外,sprintf() 通常被认为是不安全的,请改用snprintf()

          char st_str[3];
          snprintf(st_str, sizeof(st_str), "%02d", secs);
          

          注意,如果你想从函数中返回st_str,你不能使用自动数组,而是应该写

          const size_t size = 3;
          char *st_str = malloc(size);
          snprintf(st_str, size, "%02d", secs);
          

          【讨论】:

            【解决方案6】:

            删除那个大的 if/else 结构并替换为:

            sprintf(st_str, "%02d", secs);
            

            您的版本不起作用,因为%i 需要一个 int,而您正在向它提供一个指向 char 的指针。您可以使用%s“修复”它,但对于标准功能可以为您做的事情,您所做的工作量太大了。

            【讨论】:

              【解决方案7】:

              sprintf() 被调用时,代码将遇到未定义的行为,因为st_str 是一个未初始化的指针。 st_str 需要指向有效内存。

              但是,要打印前导零使用格式说明符"%02d"。例如:

              char st_str[32];
              snprintf(st_str, sizeof(st_str), "%02d", secs);
              

              并避免使用if/else

              【讨论】:

                猜你喜欢
                • 2021-12-03
                • 2018-06-11
                • 2015-08-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-01-15
                • 2014-08-20
                相关资源
                最近更新 更多