char*str = "hello";
は変更不可能な文字列リテラルです。
さまざまなベースの ASCII での h と i の表現は次のとおりです。
dec char bin hex oct
104. h 0110 1000 0x68 0150
105. i 0110 1001 0x69 0151
ご覧のとおり、ビット 1 は h から i に反転されるため、ビット操作で変更する場合は、次のようにします。
#include <stdio.h>
int main(void)
{
char str[] = "hello";
printf("%s\n", str);
str[0] |= 0x01;
printf("%s\n", str);
return 0;
}
インクリメントを使用するには:
++str[0];
また:
char *p = str;
++*p;
インクリメントとビット処理の両方で同じことが大文字にも当てはまります。
ASCII セットを使用する場合は、他にも優れたプロパティがあります。一例として:
dec char bin hex oct
65. A 0100 0001 0x41 101o
66. B 0100 0010 0x42 102o
67. C 0100 0011 0x43 103o
68. D 0100 0100 0x44 104o
|
+--- flip bit 5 to switch between upper and lower case.
This goes for all alpha characters in the ASCII set.
97. a 0110 0001 0x61 141o
98. b 0110 0010 0x62 142o
99. c 0110 0011 0x63 143o
100. d 0110 0100 0x64 144o
したがって:
char str[] = "hello";
str[0] ^= 0x20;
printf("%s\n", str); /* Print Hello */
str[0] ^= 0x20;
printf("%s\n", str); /* Print hello */
より頻繁に使用されるもう 1 つのものは、たとえばEBCDICでも同じですが、数値のプロパティです。それらは 0 からの距離を注文し、連続範囲内にあるため、次のようになります。
char num[] = "3254";
int n1 = num[0] - '0'; /* Converts char '3' to number 3 */
int n2 = num[1] - '0'; /* Converts char '2' to number 2 */
etc.
16 進値の文字列表現を数値に変換するときに、これを ASCII 用に展開できます。これは、アルファベット文字も順番に並べられているためです。
unsigned hex_val(char c)
{
if (c >= '0' && c <= '9')
return c - '0';
if (c >= 'a' && c <= 'f')
return c - 'a' + 10;
if (c >= 'A' && c <= 'F')
return c - 'A' + 10;
return ~0;
}
わかった。おそらくそこでやめた方がいいでしょう…</p>