【问题标题】:Issue with saving characters in multidimensional array在多维数组中保存字符的问题
【发布时间】:2015-01-19 01:05:21
【问题描述】:

我有四个 scanf 字符串的给定输入,我想将其保存在多维数组中。我不知道我是否正确保存了字符串,但我不能简单地打印整个数组或其中的某些字符。

char getr[4][4];

    for (z=0; z<4; z++){
    scanf(" %99s", &getr[z]);
    }

    for (s=0; s<4; s++) {
        printf("%s\n",getr[s]);
    }

输入: A B C D efgh 伊克尔 操作

输出: abcdefghijklmnop 埃夫吉克姆诺普 艾克姆诺普 操作

如果我只想打印第二行或第一行的第四个字符怎么办?有人知道吗?

【问题讨论】:

  • 您需要为终止的空字符留出空间(即 4 个字符的字符串需要 5 个元素)。此外,当您没有空间容纳 99 个字符的字符串时,不要使用 %99s

标签: c multidimensional-array char printf scanf


【解决方案1】:

首先,修改如下:

scanf(" %99s", getr[z]);  //getr[z] is the address to take the 4 characters string

打印第二行:

printf("%s\n", getr[1]);

打印第一行的第四个字符:

printf("%c\n", getr[0][3]);  // %c is used here because just print one character.

【讨论】:

    【解决方案2】:

    要存储 4 个字符的字符串,就像您的示例输入一样,您需要 5 个字符的数组来为终止的空字符留出空间:

    char getr[4][5];
    

    您的scanf() 格式字符串还应该反映您拥有的空间量; %99s 最多可以读取 100 个字节(99 个字符加上 null),而您只有 5 个(包括 null,经过上述更改)。此外,&amp;getr[z]getr[z] 恰好给出了相同的地址,但指针的类型不同——但 getr[z] 给出了适合这种情况的 char *。所以...

        scanf(" %4s", getr[z]);
    

    这些更改已经阻止字符串一起运行,因此可以通过getr[0]getr[3] 访问各个字符串。要打印字符串中的单个字符,请添加一组额外的索引括号并使用打印字符而不是字符串的函数:

    fputc(getr[0][2],stdout); /* print 3rd char in 1st string */
    
    printf("%c",getr[1][3]); /* print 4th char of 2nd string */
    

    您将所有字符串连接起来的原因是,早期字符串中的空字符溢出到下一个字符数组中,并被您读取的下一个字符串的第一个字符覆盖。最后一个字符串的 null 会溢出整个二维数组,进入内存中的下一个数组(这很糟糕)。

    【讨论】:

      猜你喜欢
      • 2022-12-15
      • 2012-10-25
      • 1970-01-01
      • 2015-06-16
      • 2014-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      相关资源
      最近更新 更多