【问题标题】:Why are these loops incrementing strangely?为什么这些循环会奇怪地增加?
【发布时间】:2013-10-23 15:49:51
【问题描述】:
#include <stdio.h>
#include <stdlib.h>

    int main(){

        int rows, col, i, j;
        char **mazeArrP;

        scanf("%d %d", &rows, &col);

        mazeArrP = (char **) malloc(rows*sizeof(char));

        for(i = 0; i<rows; i++){

            printf("i = %d\n", i);
            mazeArrP[i] = (char *) malloc(col*sizeof(char));

            for(j = 0; j<col; j++){

                printf("j = %d\n", j);
                scanf("%c", &mazeArrP[i][j]);
            }
        }

        return 0;
    }

我使用打印来确定我当前在循环中的位置。我正在尝试创建一个简单的 2D 字符数组,但我的循环表现得很奇怪。这是我第一次尝试使用双指针来创建二维数组,因此也非常感谢该领域的任何帮助。它似乎是 0,0 和 0,1 然后要求扫描,然后跳到 i=1 j =0,依此类推。我在这里缺少一些基本的东西吗?

【问题讨论】:

    标签: c loops multidimensional-array


    【解决方案1】:
    mazeArrP = (char **) malloc(rows*sizeof(char));
    

    错了。改为

    mazeArrP = malloc(rows * sizeof(*mazeArrP));
    

    还有一行

    mazeArrP[i] = (char *) malloc(col*sizeof(char));
    

    可以写成

    mazeArrP[i] = malloc(col);
    

    sizeof(char) 为 1,所以它是多余的。

    【讨论】:

    • 不要投射malloc 输出
    • @P0W 是的,我会提到这一点。谢谢。
    • @Smac89 sizeof(*mazeArrP) 更好,因为即使更改mazeArrP 的类型也是正确的
    • @hacks see this你会知道的。
    • @Gangadhar;好的。感谢您的链接。
    【解决方案2】:

    除了malloc问题,

    您的循环行为“奇怪”,因为前一个 scanf 的尾随换行符被视为新输入。

    所以使用:

    int c;
    while((c=getchar())!='\n' && c!=EOF) ; //to remove newlines from previous scanf
    

    scanf之后

    【讨论】:

    • 只需将scanf("%c", &amp;mazeArrP[i][j]); 更改为scanf(" %c", &amp;mazeArrP[i][j]); 也可以。因为在%c 之前添加space 相当于fflush();
    • 我最初没有任何打印或新行但添加了它们,因为循环只会扫描 4 个字符而不是 6 个。当我一起删除打印命令时,它仍然只扫描 4 个字符和奇怪地增加。
    • @VedantTerkar;这是 P0W 最喜欢的产品线之一。他在这里用过很多次。 :)
    • @RJones 很高兴我的评论对你有用。
    • @VedantTerkar 谢谢你和 P0W!
    猜你喜欢
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多