0

I've got a main program:

int main() {
    char *str = "hello";
    printf("%s\n", str);
    /* Shift first byte 1 to get "iello" */

    /* Have tried
    str[0] >>= 8; */
    printf("%s\n", str);
    return 0;
}

Basically shift the first byte of the string up a byte to go from hello to iello or Hello to Iello

4

3 に答える 3

3

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>

于 2013-11-05T05:39:10.330 に答える