在多维数组中保存字符的问题

时间:2014-11-21 00:05:51

标签: c multidimensional-array char printf scanf

我有四个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 IJKL MNOP

输出: abcdefghijklmnop efghijklmnop ijklmnop MNOP

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

2 个答案:

答案 0 :(得分:0)

首先,改变如下:

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.

答案 1 :(得分:0)

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

char getr[4][5];

您的scanf()格式字符串也应该反映您拥有的空间量; %99s最多可读取100个字节(99个字符加上空值),而您只有5个(包括上述更改后的空值)。此外,&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 char溢出到下一个char数组中,并被你读取的下一个字符串的第一个字符覆盖。最后一个字符串的null会溢出你的整个2D数组,进入内存中的下一个(这很糟糕)。