#include <iostream>
#include <string.h>
using namespace std;
int main() {
int c;
while ((c = getchar()) != EOF) {
// 字母映射
if (c == 'w') putchar('Q');
else if (c == 'e') putchar('W');
else if (c == 'r') putchar('E');
else if (c == 't') putchar('R');
else if (c == 'y') putchar('T');
else if (c == 'u') putchar('Y');
else if (c == 'i') putchar('U');
else if (c == 'o') putchar('I');
else if (c == 'p') putchar('O');
else if (c == '[') putchar('P');
else if (c == ']') putchar('[');
else if (c == '\\') putchar(']');
else if (c == 'a') putchar('A');
else if (c == 's') putchar('S');
else if (c == 'd') putchar('D');
else if (c == 'f') putchar('F');
else if (c == 'g') putchar('G');
else if (c == 'h') putchar('H');
else if (c == 'j') putchar('J');
else if (c == 'k') putchar('K');
else if (c == 'l') putchar('L');
else if (c == ';') putchar('K');
else if (c == '\'') putchar(';');
else if (c == 'z') putchar('X');
else if (c == 'x') putchar('Z');
else if (c == 'c') putchar('C');
else if (c == 'v') putchar('V');
else if (c == 'b') putchar('B');
else if (c == 'n') putchar('N');
else if (c == 'm') putchar('M');
else if (c == ',') putchar('M');
else if (c == '.') putchar(',');
else if (c == '/') putchar('.');
// 如果没有对应字符,输出原字符
else putchar(c);
}
return 0;
}
第一种 逆天代码
#include <iostream>
#include <string.h>
using namespace std;
char s[] = "`1234567890-=QWERTYUIOP[]\\ASDFGHJKL:'ZXCVBNM,./";
int main() {
int i, c;
while ((c = getchar()) != EOF) {
for (i = 1; s[i] && s[i] != c; i++);
if (s[i]) {
putchar(s[i - 1]);
} else {
putchar(c);
}
}
return 0;
}
第二个紫皮标答
-
字符数组定义:
char s[] = "
1234567890-=QWERTYUIOP[]\ASDFGHJKL:'ZXCVBNM,./";:定义了一个字符数组
s`,包含了特定的字符集。这个数组模拟了 QWERTY 键盘的布局,用于字符映射。
int main() {int i ,c;
- 主函数开始:
- 定义两个整型变量
i
和c
。i
用于循环索引,c
用于存储输入的字符。
- 定义两个整型变量
while ((c = getchar()) != EOF) {
- 字符输入循环:
- 使用
getchar()
从标准输入读取一个字符,并赋值给c
。循环将一直执行,直到遇到EOF
(文件结束符)。
- 使用
for (i = 1; s[i] && s[i] != c; i++);
- 查找输入字符:
for
循环从s[1]
开始遍历字符数组s
。循环条件是s[i]
不为空且s[i]
不等于输入字符c
。- 这个循环的目的是找到输入字符在数组中的索引位置。注意这里从
s[1]
开始,意味着它将跳过字符数组中的第一个字符(即 '`')。
if (s[i]) { putchar(s[i - 1]); } else { putchar(c); }
- 字符映射与输出:
if (s[i])
:检查是否找到与输入字符c
相匹配的字符。如果找到了(即s[i]
不为'\0'
),则输出s[i - 1]
,这是输入字符的前一个字符。- 如果没有找到匹配字符(即
s[i]
为'\0'
),则输出原字符c
。这确保了所有未匹配的字符都能够原样输出。
这里我简单给讲了一下标答代码的流程
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
char s[] = "QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./";
int c;
while ((c = getchar()) != EOF) {
int i;
for (i = 0; s[i] != '\0'; i++) {
if (s[i] == c) {
// 如果当前字符在 s 中找到,输出它的前一个字符
if (i > 0) {
putchar(s[i - 1]);
} else {
putchar(c); // 如果是 s 的第一个字符,输出原字符
}
break;
}
}
if (s[i] == '\0') {
// 如果当前字符不在 s 中,直接输出它
putchar(c);
}
}
return 0;
}
这是我写的
知识点总结
-
字符输入与输出:
- 使用
getchar()
函数从标准输入获取字符,直到遇到EOF
(文件结束符)。 - 使用
putchar()
函数输出单个字符。
- 使用
2.代码细节:
'\0'这个标识符来判断遍历完然后如果遍历完没有搜索到就返回原字符这个是来判断空格的还有第一个键位应为没有前一个字符。
接下来我会详细讲解
1. 使用 '\0'
来判断遍历结束
- 字符数组结束标识:在 C/C++ 中,字符串是以
'\0'
(空字符)作为结束标识的。这意味着,当你遍历一个字符数组时,可以通过检查当前字符是否为'\0'
来判断是否已经遍历完了整个数组。 - 处理未匹配的字符:在你的代码中,如果遍历结束时没有找到匹配的字符(即
s[i]
为'\0'
),这表明输入字符不在字符数组中,程序将输出原字符c
。这包括了空格和其他未被映射的字符。
2. 第一个键位没有前一个字符
- 前一个字符的处理:在字符数组
s
中,通常第一个字符(索引0
)是没有前一个字符的。在代码中,从s[1]
开始遍历,这样可以确保在找到匹配时,输出的是前一个字符(即s[i - 1]
)。 - 边界条件:如果输入的字符是字符数组的第一个字符(例如 '
'),在这种情况下,程序会尝试访问
s[i - 1],但是
i的值为
1,因此
s[i - 1]实际上是
s[0]`,这会返回第一个字符。为了处理这种情况,通常需要添加额外的条件判断,以确保不输出不存在的前一个字符。
代码中的实现示例
for (i = 1; s[i] && s[i] != c; i++);
if (s[i]) {
putchar(s[i - 1]); // 输出前一个字符
} else {
putchar(c); // 没有找到匹配,输出原字符
}
- 这里
s[i]
在循环中用于检查字符是否匹配,并且遍历到数组的结束。 - 如果
s[i]
找到了对应的字符,则输出s[i - 1]
。如果遍历结束(即s[i]
为'\0'
),则输出原字符c
。
总结
这段代码的目的是读取输入字符并将其转换为 QWERTY 键盘的对应字符。它采用了一种简单的线性搜索方式来查找输入字符,并输出它的前一个字符。未匹配的字符则直接输出,确保输入的所有内容都得到处理。
注意事项
- 字符映射的起始索引:由于从
s[1]
开始遍历,意味着s[0]
对应的字符不会被处理。如果需要处理所有字符,可以考虑从s[0]
开始。 - 效率问题:对于较大的字符集,线性搜索效率较低。在更复杂的应用中,可以考虑使用哈希表或其他数据结构来提高查找效率。
- 输入输出格式:确保输入中包含了所有需要处理的字符,包括标点符号、空格等,以符合实际使用的场景。
-
输入的合法性:
- 在处理输入字符时,考虑可能的非法字符和空输入情况。
- 需要确保程序能够优雅地处理所有可能的输入,包括标点符号和空格。
-
格式和输出:
- 在输出字符时,确保不添加多余的空格或换行,保持输出格式的一致性。
- 特别是在在线评测系统中,注意输出的格式要求,以避免 "Presentation Error"。