C语言 我的程序不会打印出整个数组

wvmv3b1j  于 2023-10-16  发布在  其他
关注(0)|答案(2)|浏览(136)

我的代码如下:

#include <stdio.h>

#define NEW_LINE 10
#define TAB 9
#define SPACE 32

int main() {
    int c;
    int counter1 = 0;
    int counter2 = 0;
    int word[10][10] = { { 0 } };

    while ((c = getchar()) != EOF) {
        if (c != TAB && c != NEW_LINE && c != SPACE) {
            word[counter1][counter2] = c;
            ++counter2;
        } else {
            counter2 = 0;
            ++counter1;
        }
    }

    for (int a = 0; a <= 9; ++a) {
        printf("\n");
        for (int b = 0; b <= 9; ++b) {
            printf("%4d", word[a][b]);
        }
    }

    return 0;
}

我试着让用户输入并保存出现的单词。我的想法是我首先得到字母并将它们保存到一个数组中,形成一个单词,然后将每个单词保存到数组中(形成2D数组)。问题是我只打印出第一个字符数组,其余的由于某种原因被忽略了。我是一个初学者在C编程,所以不要生气,如果有一些愚蠢的错误。

输出如下:

Hello World

  87 111 114 108 100   0   0   0

gojuced7

gojuced71#

为了解决程序不打印出整个数组的问题,我们需要确保程序没有在数组的边界之外写入。一种方法是根据字的数量和每个字的长度为数组动态分配内存。

kr98yfug

kr98yfug2#

只要输入的分隔符不超过10个,并且单词都不超过10个字符,代码看起来就没问题。我得到我的笔记本电脑上的完整输出,只有一个最后的换行符应该输出良好的风格。
上传的快照不完整:第一行对应于第二个字World,但是它应该在末尾具有2个零,并且在图像的底部可以看到另一行的顶部像素。试着放大你的VS输出面板的大小。
为了避免未定义的行为,你应该保护你的程序免受缓冲区溢出的影响,例如忽略2D数组之外的字符:

#include <stdio.h>

#define NEW_LINE 10
#define TAB 9
#define SPACE 32

int main() {
    int c;
    int counter1 = 0;
    int counter2 = 0;
    int word[10][10] = { { 0 } };

    while ((c = getchar()) != EOF) {
        if (c != TAB && c != NEW_LINE && c != SPACE) {
            if (counter1 < 10 && counter2 < 10) {
                word[counter1][counter2] = c;
                ++counter2;
            }
        } else {
            counter2 = 0;
            ++counter1;
        }
    }

    printf("\n");
    for (int a = 0; a < 10; a++) {
        for (int b = 0; b < 10; b++) {
            printf("%4d", word[a][b]);
        }
        printf("\n");
    }

    return 0;
}

相关问题