0

私は現在 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);
}
4

7 に答える 7

1

が初期化されていないポインタsprintf()として呼び出されると、コードで未定義の動作が発生します。有効なメモリを指している必要があります。st_strst_str

ただし、先行ゼロを出力するには、フォーマット指定子を使用します"%02d"。例えば:

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

を避けてくださいif/else

于 2012-12-18T17:51:42.397 に答える
1

その大きなif/else構文を削除し、次のように置き換えます。

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

%iintを期待していて、charへのポインタをフィードしているため、バージョンが機能していません。で「修正」することもできますが%s、それは標準関数で実行できることに対して実行している作業が多すぎます。

于 2012-12-18T17:51:56.443 に答える
1

st_strにsprintf()を実行する場合は、メモリを割り当てる必要があります。しかし、あなたが思いついたコードは絶対に不要です。%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);
于 2012-12-18T17:52:16.623 に答える
0

フォーマット文字列にゼロを入れて使用することができます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);
}
于 2012-12-18T17:51:03.450 に答える
0

以下でこれを使用してください:

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

または、使用法のみを表示しprintf("%02d",secs)、それを出力画面に直接印刷する場合。

編集:しかし、の値を維持するためにsprintfメモリを割り当てている必要がある場合があることを覚えておいてください。st_strsecs

于 2012-12-18T17:52:32.187 に答える
0

なぜそれを文字列に変換するのですか。printfパディング付きの数値を表示できます

たとえば。

int secs;

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

または、文字列にしたい場合

char s[20];
snprintf(s, 20,"%02d", secs);
于 2012-12-18T17:56:36.963 に答える
0

最小n桁数を出力するには、次のようにフォーマッタで精度ポイントを使用できます。

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

文字変数などを作成する必要はありません!

于 2012-12-18T17:58:29.990 に答える