几周前我刚开始学习C语,关注了一本关于C的书。每一章都有一些练习,我可以解释为什么我的代码没有#&# 39;工作。分配是从用户那里获得一些字符串,这些字符串将进入一个二维数组。然后,向后打印每个字符串。
例如,
用户将输入以下字词: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;
}
提前谢谢!
答案 0 :(得分:1)
%s
需要char *
您发送char (*)[6]
。
scanf("%s", &string[i]);
=&gt; scanf("%5s", string[i]);
您的for
循环j
错误,您打印nul终止字节。在这种情况下,你应该使用while
循环在C中更加惯用。
for (i = 0; i < 5; i++) {
j = 5;
while (j-- > 0) {
printf("%c", string[i][j]);
}
printf("\n");
}
答案 1 :(得分:1)
我假设你代码崩溃了。您只使用具有五个字符的字符串。然后你打印出七个字符(索引6,5,4,3,2,1,0)。那太多了。第一个(从索引6开始)导致从数组外部读取,这导致未定义的行为。然后,当您按字符打印我们的字符时,您不应该打印出scanf添加到字符串的结束零。它不是可见的角色。在本练习中,您可以将其替换为空格,例如。
另外,请确保不要添加超过五个字符的任何字符串。这也会导致未定义的行为,很可能是崩溃。你可以通过使用%5s替换%s来使scanf最多只读取五个字符串来避免这种情况。即使这样,如果输入字符串少于五个字符,你就会遇到问题或打印出垃圾,所以你不应该将j设置为数组的长度,而是设置为字符串的长度(减去1)。
j=strlen(string)-1;
可能还有其他问题,但先解决这些问题,看看会发生什么。