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 */
另一个更常用的,并且对于例如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.
在将十六进制值的字符串表示形式转换为数字时,您可以将其扩展为 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>