【问题标题】:two-dimensional strings in CC中的二维字符串
【发布时间】:2017-05-19 21:41:55
【问题描述】:

几周前我刚开始学习 C,通过阅读一本关于 C 的书。每章末尾都有一些练习,有一个练习我不知道为什么我的代码不起作用。任务是从用户那里获取一些字符串,这些字符串将进入一个二维数组。然后,向后打印每个字符串。

例如,

用户将输入单词:sleephellogreat

输出将是:peelsollehtaerg

它必须是一个二维数组(这就是本章的内容)。

这是我的代码:

#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;

}

提前谢谢你!

【问题讨论】:

  • 你的代码怎么不工作 - 你得到什么输出?
  • 1.应该是scanf("%s", string[i]); 2.应该是for(j = 5; j &gt;= 0; j--) 3.不用再写j = 6了!
  • @kiner_shah "5s" 错字为"%5s"(和j=5 --> j=last_char_index
  • @BLUEPIXY,更正了错字,是的,应该是j = last_char_index
  • @kiner_shah 你为什么扔掉5

标签: c arrays multidimensional-array c-strings


【解决方案1】:

%s 需要char * 你发送char (*)[6]

scanf("%s", &amp;string[i]); => 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");
}

【讨论】:

    【解决方案2】:

    我假设您的代码崩溃了。您只使用包含五个字符的字符串。然后打印出七个字符(索引 6、5、4、3、2、1、0)。那两个太多了。第一个(从索引 6 开始)导致从数组外部读取,这导致未定义的行为。然后,当您逐个字符打印我们的字符时,您不应该打印出由 scanf 添加到字符串的末尾零。它是不可见的字符。例如,在本练习中,您可以将其替换为空格。

    还要确保不要添加任何长度超过五个字符的字符串。这也会导致未定义的行为,很可能是崩溃。您可以通过将 %s 替换为 %5s 使 scanf 最多只读取五个字符串来避免这种情况。即使这样,如果输入字符串少于五个字符,您也会遇到问题或打印出垃圾,因此您不应将 j 设置为数组的长度,而应设置为字符串的长度(减一)。

    j=strlen(string)-1;
    

    可能还有其他问题,但请先解决这些问题,然后看看会发生什么。

    【讨论】:

    • 这不是真正的答案,您指出的任何内容都不会导致程序崩溃。(除非输入不正确)
    • 没错,在数组边界之外读取不会导致崩溃(大多数情况下),只有添加超过 5 个字符的字符串才会导致崩溃。
    • 它不一定会导致崩溃,只是调用未定义的行为,此外,没有关于如何确保不会发生这种情况的建议,而且该操作提供的输入长度超过 5 个字符也是值得怀疑的。
    • @George:越界访问数组 (string[i][6]) 会引发未定义的行为,因此很可能会导致程序崩溃。
    • @George 我添加了一些关于如何避免未定义行为(可能崩溃)和打印垃圾的说明。现在好点了吗? :) 由于杰西卡正在学习这门语言,我认为给出现成的答案并指出问题没有任何目的。
    猜你喜欢
    • 1970-01-01
    • 2014-01-14
    • 2021-03-28
    • 2016-02-22
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多