【发布时间】:2020-11-07 00:45:01
【问题描述】:
我是 C 的初学者,我想编写一个将用户输入转换为摩尔斯电码的程序。 这就是我所做的:
char morseCode[26][4] = {
".-", /* A */
"-..", /* B */
"-.-.", /* C* */
"-..", /* D */
".", /* E */
"..-.", /* F* */
"--.", /* G */
"....", /* H* */
"..", /* I */
".---", /* J */
"-.-", /* K */
".-..", /* L* */
"--", /* M */
"-.", /* N */
"---", /* O */
".--.", /* P* */
"--.-", /* Q* */
".-.", /* R */
"...", /* S */
"-", /* T */
"..-", /* U */
"...-", /* V* */
".--", /* W */
"-..-", /* X* */
"-.--", /* Y* */
"--.." /* Z */
};
char uString[100], newString[100];
int uChoice;
int main(){
//printf("morseCode[%d] = %s\n", 2, morseCode[2]);
printf("Enter text (max 100 characters): ");
fgets(uString, 100, stdin);
printf("\nString in morse code: \n");
for (int i = 0; i < strlen(uString); i++) {
uString[i] = toupper(uString[i]);
newString[i] = uString[i] - 'A';
printf("newString[%d] = %d\tmorseCode[newString[%d]] = %s\n", i, newString[i], i, morseCode[newString[i]]);
}
return 0;
}
请注意,我在面临输出错误的 cmets 中放置了一个 *。这是我打印出来的样子:imgur
我在网上寻找解决方案,发现有人做了同样的事情,但他这样声明他的“莫尔斯电码”版本:
char *morseCode[] = {/* Strings here*/};
当我这样做时,一切都运行良好,并且完全按照预期输出。
为什么将morseCode 设为指针可以解决这些问题?我认为任何具有char 数据类型的数组都会立即成为指针?这只是我应该一直做的最佳做法吗?
【问题讨论】:
-
不要弄乱你的字符串,而是做类似
int index = uString[i] - 'A'的事情。在继续引用无效索引之前,您还应该确保您的输入没有超出允许的范围。 -
这一行包含了一个初学者常犯的不幸错误:
for (int i = 0; i < strlen(uString); i++) {这每次循环计算字符串的长度。通过在进入循环之前计算一次长度并将结果保存在变量中来修复它。然后在循环中使用变量。这与您遇到的行为无关,但它是糟糕的代码。