Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的二维字符串_C_Arrays_Multidimensional Array_C Strings - Fatal编程技术网

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

几周前,我刚开始学习C语言,我读了一本关于C语言的书。每一章的结尾都有一些练习,有一个练习我不明白为什么我的代码不起作用。任务是从用户那里获取一些字符串,这些字符串将输入到二维数组中。然后,向后打印每个字符串

比如说,

用户将输入以下文字:
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;