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

4

您不能修改字符串文字,请将其更改为:

char str[] = "hello";   //not string literal
printf("%s\n", str);
str[0]++;              //add 1 to the first element
printf("%s\n", str);
于 2013-11-05T05:27:47.960 回答
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 */

另一个更常用的,并且对于例如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>

于 2013-11-05T05:39:10.330 回答
2

执行以下操作:

#include <stdio.h>
#include <ctype.h>

int main() {
char str[] = "hello";
printf("%s\n", str);

//str[0]=str[0]+1;

// to get uppercase letter include ctype.h header

str[0] = toupper(str[0] + 1);

printf("%s\n", str);
return 0;
}
于 2013-11-05T05:27:37.127 回答