gpt4 book ai didi

c - 没有指针的奇怪输出

转载 作者:行者123 更新时间:2023-12-04 02:30:08 24 4
gpt4 key购买 nike

我是 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;
}

请注意,我在遇到输出错误的注释中放置了 *。这是我打印出来时的样子:imgur

我在网上寻找解决方案,发现有人做同样的事情,但他这样声明他的“morseCode”版本:

char *morseCode[] = {/* Strings here*/};

当我这样做时,一切都完美地工作并且输出完全符合预期。为什么将 morseCode 设为指针可以解决这些问题?我认为任何具有 char 数据类型的数组都会立即成为指针吗?这只是我应该一直做的最佳实践吗?

最佳答案

char morseCode[26][4] 只为每个字符串分配四个字节。 C 中的字符串必须以空字符结尾。 ".-." 等字符串文字会自动包含此字符。您的某些字符串有四个非空字符,例如 ".--."。因此,当包含空字符时,它们需要五个字符。因为您使用 [4] 定义了数组,所以数组中没有足够的空间容纳空字符,因此未包括在内。这会在打印字符串时导致错误。

您可以通过将 [4] 更改为 [5] 来修复它。

更改为指针之所以有效,是因为字符串文字没有用于初始化数组,而是被放置在内存中,并且创建了指向它们的指针。当他们初始化数组时,如果空字符不合适,它就会被忽略。当它们被放入内存时,空字符被包含在内。

关于c - 没有指针的奇怪输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64723359/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com