
这是学校给的一串代码,但是由于gets不能在VS2022上运行,所以我改了一下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
int main() {
// 修正str[0]的顺序:按1次0输出'0',按2次输出空格(符合题目“0和空格”的规则)
char ch[501], str[10][6] = {
"0 ", // 0对应的字符:按1次→'0',按2次→' '
"1,.?!", // 1对应的字符
"2ABC", // 2对应的字符
"3DEF", // 3对应的字符
"4GHI", // 4对应的字符
"5JKL", // 5对应的字符
"6MNO", // 6对应的字符
"7PQRS", // 7对应的字符
"8TUV", // 8对应的字符
"9WXYZ" // 9对应的字符
};
int i, j, k, len, flag = 0, count = 0;
fgets(ch, sizeof(ch), stdin);
ch[strcspn(ch, "\n")]= '\0 ';
len = strlen(ch);
for (i = 0; i < len; i++) {
if (ch[i] != ' ') { // 遇到数字,统计当前数字的按下次数
count++;
flag = 1; // 标记处于“当前数字的按键段”
}
else if (flag)
{ // 遇到空格,处理当前按键段
j = ch[i - 1] - '0'; // 将字符数字转为整数(如'2'→2)
//int str_len = strlen(str[j]); // 获取当前数字对应的字符组长度
// 计算对应字符的索引:按n次→取第n-1位(循环取余)
k = (count - 1) % strlen(str[j]);
printf("%c", str[j][k]); // 输出对应字符
count = 0; // 重置按下次数
flag = 0; // 重置按键段标记
}
}
return 0;
}
新的代码在gets与最后一个字符上优化了一下
但是我认为这一串代码本来运行不了的
因为
ch[strcspn(ch, "\n")]= '\0 ';
单引号不应该填字符串吗?我填了\0与空格却能运行,为什么啊?我改成了双引号反而会报错,我怎么学习这方面的内容啊?