Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在字符中显示int,并进行一些修改_C_String_Pointers_Char_Printf - Fatal编程技术网

C 在字符中显示int,并进行一些修改

C 在字符中显示int,并进行一些修改,c,string,pointers,char,printf,C,String,Pointers,Char,Printf,我目前正在将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";

我目前正在将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);
}
char*st_str;

如果(秒)您可以将零放在格式字符串中并使用
sprintf(…)

现在请注意,由于您可以在同一语句中概括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);
}
str_str=malloc();
开关(秒)
{
案例0:
案例1:
案例2:
案例3:
案例4:
案例5:
案例6:
案例7:
案例8:
案例9:
sprintf(st_str,“0%d”,秒);
打破
违约:
sprintf(圣母大学街,“%d”,秒);
}

您可以将零放在格式字符串中,然后使用
sprintf(…)

现在请注意,由于您可以在同一语句中概括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);
}
str_str=malloc();
开关(秒)
{
案例0:
案例1:
案例2:
案例3:
案例4:
案例5:
案例6:
案例7:
案例8:
案例9:
sprintf(st_str,“0%d”,秒);
打破
违约:
sprintf(圣母大学街,“%d”,秒);
}

sprintf()
被称为
st_str
是未初始化的指针时,代码将经历未定义的行为。
st_str
需要指向有效内存

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

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

并避免使用
if/else
sprintf()
被称为
st_str
是未初始化的指针时,代码将经历未定义的行为。
st_str
需要指向有效内存

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

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

并避免使用
if/else

删除较大的if/else结构,并替换为:

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

您的版本不起作用,因为
%i
需要一个int,而您正在向它提供一个指向char的指针。您可以使用
%s
来“修复”它,但这对于标准函数可以为您做的事情来说太多了。

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

sprintf(st_str, "%02d", secs);
您的版本不起作用,因为
%i
需要一个int,而您正在向它提供一个指向char的指针。您可以使用
%s
来“修复”它,但这对于标准函数可以为您做的事情来说太多了。

如果您想要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);
如果你想将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);
请在下面使用此选项:

if(secs >=0 && secs < 10)
 sprintf(st_str,"0%d",secs);
else
 sprintf(st_str,"%d",secs);
如果(秒>=0&&secs<10)
sprintf(st_str,“0%d”,秒);
其他的
sprintf(圣母大学街,“%d”,秒);
或者,如果您只想显示,请使用
printf(“%02d”,secs)
并直接将其打印到输出屏幕

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

if(secs >=0 && secs < 10)
 sprintf(st_str,"0%d",secs);
else
 sprintf(st_str,"%d",secs);
如果(秒>=0&&secs<10)
sprintf(st_str,“0%d”,秒);
其他的
sprintf(圣母大学街,“%d”,秒);
或者,如果您只想显示,请使用
printf(“%02d”,secs)
并直接将其打印到输出屏幕


编辑:但请记住,在
sprintf
的情况下,您必须为
st_str
分配内存才能保留
secs
的值,为什么要将其转换为字符串。
printf
可以显示带填充的数字

例如

int secs;

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

为什么要将其转换为字符串。
printf
可以显示带填充的数字

例如

int secs;

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

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

printf(“%.2d”,秒);


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

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

printf(“%.2d”,秒);

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

我认为应该是
我认为应该是