题意:读入一行字符串,16个字符输出一行内容,按格式输出16个字符的ascii码,不足16个字符补上空格,每行的开头是第k个字符的首地址,输出16进制数,每行最后要输出原字符,大写字母换为小写,小写换为大写。
题解:处理有点麻烦的字符串水题。
#include <stdio.h>
#include <string.h>
const int N = 5000;
char str[N];
int main() {
while (gets(str)) {
int len = strlen(str);
for (int i = 0; i < len; i++) {
if (i % 16 == 0) {
if (i > 0) {
for (int j = i - 16; j < i; j++) {
if (str[j] >= 'A' && str[j] <= 'Z')
printf("%c", str[j] + 32);
else if (str[j] >= 'a' && str[j] <= 'z')
printf("%c", str[j] - 32);
else
printf("%c", str[j]);
}
printf("\n");
}
printf("%04x: ", i);
}
printf("%x", str[i]);
if (i & 1)
printf(" ");
}
if (len % 16) {
int temp = len % 16;
int l = 16 - temp;
if (l % 2)
l = l * 2 + l / 2 + 1;
else
l = l * 2 + l / 2;
for (int i = 0; i < l; i++)
printf(" ");
for (int j = len - temp; j < len; j++) {
if (str[j] >= 'A' && str[j] <= 'Z')
printf("%c", str[j] + 32);
else if (str[j] >= 'a' && str[j] <= 'z')
printf("%c", str[j] - 32);
else
printf("%c", str[j]);
}
printf("\n");
}
else {
for (int j = len - 16; j < len; j++) {
if (str[j] >= 'A' && str[j] <= 'Z')
printf("%c", str[j] + 32);
else if (str[j] >= 'a' && str[j] <= 'z')
printf("%c", str[j] - 32);
else
printf("%c", str[j]);
}
printf("\n");
}
}
return 0;
}