天天看点

hdu 4054

题意:读入一行字符串,16个字符输出一行内容,按格式输出16个字符的ascii码,不足16个字符补上空格,每行的开头是第k个字符的首地址,输出16进制数,每行最后要输出原字符,大写字母换为小写,小写换为大写。

题解:处理有点麻烦的字符串水题。

#include <stdio.h>
#include <string.h>
const int N = ;
char str[N];

int main() {
    while (gets(str)) {
        int len = strlen(str);
        for (int i = ; i < len; i++) {
            if (i %  == ) {
                if (i > ) {
                    for (int j = i - ; j < i; j++) {
                        if (str[j] >= 'A' && str[j] <= 'Z')
                            printf("%c", str[j] + );
                        else if (str[j] >= 'a' && str[j] <= 'z')
                            printf("%c", str[j] - );
                        else
                            printf("%c", str[j]);
                    }
                    printf("\n");
                }
                printf("%04x: ", i);
            }
            printf("%x", str[i]);
            if (i & )
                printf(" ");
        }
        if (len % ) {
            int temp = len % ;
            int l =  - temp;
            if (l % )
                l = l *  + l /  + ;
            else
                l = l *  + l / ;
            for (int i = ; i < l; i++)
                printf(" ");
            for (int j = len - temp; j < len; j++) {
                if (str[j] >= 'A' && str[j] <= 'Z')
                    printf("%c", str[j] + );
                else if (str[j] >= 'a' && str[j] <= 'z')
                    printf("%c", str[j] - );
                else
                    printf("%c", str[j]);
            }
            printf("\n");
        }
        else {
            for (int j = len - ; j < len; j++) {
                if (str[j] >= 'A' && str[j] <= 'Z')
                    printf("%c", str[j] + );
                else if (str[j] >= 'a' && str[j] <= 'z')
                    printf("%c", str[j] - );
                else
                    printf("%c", str[j]);
            }
            printf("\n");
        }
    }
    return ;
}