文字列値「110099」があり、部分文字列値「00」を y まで x ずつインクリメントし、ゼロにラップする必要があるとします。 「119099」の後の文字列値は「110099」です。誰でもどうやって始めればいいのか教えてください。御時間ありがとうございます。
編集:質問を一般的なものに変更しました。
1 桁だけを確認して変更する必要があるため、文字列表現で直接行います。
おそらく次のようなものです:
#define INCR_INDEX 2
int increment(char *value)
{
if( value[INCR_INDEX] == '9' )
{
value[INCR_INDEX] = '0';
return 1;
}
++value[INCR_INDEX];
return 0;
}
上記はインクリメントを行い、1
ラップされ0
ていない場合は戻ります。
これはエンコーディングに関して 100% 安全です。C は、ホスティング環境が隣接する場所の 10 進数をエンコードすることを保証し++
ます。char
9
Replace it back in your original string.
Code is pretty simple.
の指定は"00"
、変更する必要があるのは文字列の3番目の文字だけであるため誤解を招きます(2番目の文字は変更0
され"00"
ません)。aをインクリメントすることが可能であるchar
ため、3番目char
が等しくない場合はインクリメント9
し、そうでない場合は次のように設定します0
。
char a[] = "110099";
for (int i = 0; i < 20; i++)
{
a[2] = ('9' == a[2]) ? '0' : a[2] + 1;
printf("%s\n", a);
}
https://ideone.com/uMyfoでデモを参照してください。
3番目の「桁」をインクリメントするだけです。
char s[] = "110099";
for ( ; ; )
{
printf("Current value: %s\n", s);
if (s[2] == '9') { s[2] = '0'; break; }
++s[2];
}
これは、文字セットが数字を昇順で連続して格納することを前提としています。
これをどの程度柔軟にしたいかは完全には明らかではありません。現在の質問に対する解決策は、次の関数になる可能性があります。
void increment(char str*) {
str[2]++;
if (str[2]>'9') str[2]='0';
}
テスト:
char str[] = "110099";
for (int i = 0; i < 12; i++) {
increment(str);
printf("%s\n", str);
}
結果:
111099
112099
113099
114099
115099
116099
117099
118099
119099
110099
111099
112099
それは些細なことです:
#include <stdio.h>
void incDigit(char* str, size_t pos)
{
if (++str[pos] > '9')
str[pos] = '0';
}
int main(void)
{
char str[] = "110099";
int i;
printf("Original: %s\n", str);
for (i = 1; i <= 10; i++)
{
printf("Adding 1... ");
incDigit(str, 2);
printf("%s\n", str);
}
return 0;
}
出力 ( ideone ):
Original: 110099
Adding 1... 111099
Adding 1... 112099
Adding 1... 113099
Adding 1... 114099
Adding 1... 115099
Adding 1... 116099
Adding 1... 117099
Adding 1... 118099
Adding 1... 119099
Adding 1... 110099