如何解决没有指针的奇怪输出
我是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],morseCode[newString[i]]);
}
return 0;
}
注意,我在面对输出错误的注释中加了*。这是我打印出来的样子:imgur
我在网上寻找解决方案,发现有人做了同样的事情,但是他这样声明了他的“ morseCode”版本:
char *morseCode[] = {/* Strings here*/};
当我这样做时,一切工作正常,输出完全符合预期。
为什么使morseCode
成为指针可以解决这些问题?我以为任何具有char
数据类型的数组都将立即成为指针?这是我应该一直做的最佳实践吗?
解决方法
char morseCode[26][4]
仅为每个字符串分配四个字节。 C中的字符串必须以空字符结尾。诸如".-."
之类的字符串文字会自动包含此字符。您的某些字符串包含四个非空字符,例如".--."
。因此,当包含空字符时,它们需要五个字符。因为您使用[4]
定义了数组,所以数组中没有足够的空间容纳空字符,因此不包含该字符。在打印字符串时,这会导致错误。
您可以通过将[4]
更改为[5]
来解决此问题。
更改指针之所以可行,是因为将字符串文字而不是用于初始化数组,而是将其放置在内存中,并创建了指向它们的指针。当他们初始化数组时,如果不适合,则忽略空字符。将它们放置在内存中时,将包含空字符。
,您的代码的问题是类型char [26][4]
的第二维(4)不足以容纳某些字符串的内容,因为其中一些字符串包含四个可打印字符 plus字符串终止符。当使用这样的字符串初始化数组元素之一时,仅使用前四个字符,而该元素没有终止符。尝试使用这些未终止元素之一就像字符串一样,会导致未定义行为。可以通过将声明更改为
char morseCode[26][5] = /* ... */
在每种情况下都为字符串终止符留出足够的空间。
为什么将
morseCode
用作指针可以解决这些问题?
使用morseCode
指针数组解决了此问题,因为该数组包含指向字符串文字的指针,这些字符串文字始终正确终止,而不是直接包含字符。
我认为任何具有char数据类型的数组都将立即成为指针吗?
不。没有与char
数组专门相关的特殊行为。您可能通常会考虑数组的属性,即在几乎所有情况下,当对数组值 expression 进行求值时,结果数组都会自动转换为指向数组的第一个元素。这并不意味着数组与指针是同一回事,特别是,这并不意味着数组
char *[26]
与char[26][4]
相同。前者的元素是指针(x86_64上每个8字节)。后者的元素是每个包含四个char
(四个字节,不考虑体系结构)的数组。
这是我应该一直做的最佳实践吗?
最好不要使用指向数组的指针,也不喜欢指向数组的指针的数组。您确实需要学习和理解差异。然后,您应该在任何给定的编程情况下选择更合适的那个。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。