C语言中的二维字符串
几周前,我刚开始学习C语言,我读了一本关于C语言的书。每一章的结尾都有一些练习,有一个练习我不明白为什么我的代码不起作用。任务是从用户那里获取一些字符串,这些字符串将输入到二维数组中。然后,向后打印每个字符串 比如说, 用户将输入以下文字:C语言中的二维字符串,c,arrays,multidimensional-array,c-strings,C,Arrays,Multidimensional Array,C Strings,几周前,我刚开始学习C语言,我读了一本关于C语言的书。每一章的结尾都有一些练习,有一个练习我不明白为什么我的代码不起作用。任务是从用户那里获取一些字符串,这些字符串将输入到二维数组中。然后,向后打印每个字符串 比如说, 用户将输入以下文字:sleep,hello,great 输出将是:peels,olleh,taerg 它必须是一个二维数组(这就是本章的内容) 这是我的代码: #include <stdio.h> int main() { char string[5][6
sleep
,hello
,great
输出将是:peels
,olleh
,taerg
它必须是一个二维数组(这就是本章的内容)
这是我的代码:
#include <stdio.h>
int main()
{
char string[5][6];
int i, j;
for(i=0; i<5; i++)
{
printf("please enter a string:\n");
scanf("%s", &string[i]);
}
printf("\n");
for(i=0; i<5; i++)
{
for(j=6; j<=0; j--)
{
printf("%c", string[i][j]);
}
printf("\n");
j=6;
}
return 0;
}
#包括
int main()
{
字符串[5][6];
int i,j;
对于(i=0;i%s
需要一个char*
您发送一个char(*)[6]
scanf(“%s”和&string[i]);
=>scanf(“%5s”,string[i]);
使用j
的for
循环打印nul terminate字节是错误的。您应该使用,而在这种情况下
循环在C中更为惯用
for (i = 0; i < 5; i++) {
j = 5;
while (j-- > 0) {
printf("%c", string[i][j]);
}
printf("\n");
}
(i=0;i<5;i++)的{
j=5;
而(j-->0){
printf(“%c”,字符串[i][j]);
}
printf(“\n”);
}
我假设您的代码崩溃。您只处理五个字符的字符串。然后打印出七个字符(索引6,5,4,3,2,1,0)。这太多了。第一个字符(从索引6开始时)导致从数组外部读取,这会导致未定义的行为。然后,当您逐个字符打印我们的字符时,不应打印scanf添加到字符串中的结束零。它是不可见的字符。在本练习中,您可以将其替换为空格,例如
另外,请确保不要添加任何长度超过五个字符的字符串。这也会导致未定义的行为,很可能会导致崩溃。您可以通过将%s替换为%5s,使scanf最多只能读取五个字符的字符串来避免这种情况。即使这样,如果输入字符串少于五个字符,也会出现问题或打印出垃圾,因此不应将j设置为数组的长度,而应设置为字符串的长度(减1)
可能还有其他问题,但先解决这些问题,看看会发生什么。你的代码怎么不起作用?你得到了什么输出?1.应该是scanf(“%s”,string[i]);
2.应该是for(j=5;j>=0;j--)
3.不需要再写j=6
。@kiner\u shah“5s”
键入%5s
(和j=5
-->j=last\u char\u index
)@BLUEPIXY,更正了输入错误,应该是j=last\u char\u index
!@kiner\u shah为什么要抛出5?这不是一个真正的答案,你指出的任何东西都不会导致程序崩溃。(除非输入不正确)正确,读取数组边界之外的数据不会导致崩溃(大多数情况下),只添加长度超过5个字符的字符串会使其崩溃。这不一定会导致崩溃,只需调用未定义的行为,而且没有关于如何确保不会发生这种情况的建议,而且op提供的输入长度超过5个字符也值得怀疑。@George:访问数组超出范围(string[i][6]
)引发未定义的行为,因此很可能会使程序崩溃。@乔治我添加了一些关于如何避免未定义行为(可能会崩溃)和打印垃圾的说明。现在好点了吗?:)由于杰西卡正在学习这门语言,我看不出给出现成答案的目的,而是指出问题。
j=strlen(string)-1;