“While 循环”(包含传递到函数中的数组的指针)只工作一次

"While loop" (contains pointer to array passed into a function) works only once

提问人:Filip Dvorak 提问时间:7/6/2023 最后编辑:chqrlieFilip Dvorak 更新时间:7/6/2023 访问量:58

问:

我正在用 C 编写一些代码,在函数内部有一个循环,其中包含一个函数调用,用于获取指向数组的指针。在函数中,我有一个 ,它打印存储在 “ 数组中的 3 个字符。在函数中,我只有一个指针,所以我正在做指针算术。当循环首次执行时,它工作得很好。但是,当它再次执行时,它不起作用。它不打印字母。为什么?mainwhileprintboardboardprintfboardwhile

#include <stdio.h>
#include <stdbool.h>

void printboard(char *boardp) {
    printf("  %c |  %c |  %c ", *(boardp), *(boardp + 1), *(boardp + 2));
}

int main() {

    char board[3];
    board[0] = 'a';
    board[1] = 'b';
    board[2] = 'c';

    bool playgame = true;

    while (playgame == true) {
        printboard(board);
        board[0] = 'a';
        board[1] = 'b';
        board[2] = 'c';
        scanf("%d", &playgame);
    }
    return 0;
}
C 函数 指针 while 循环 按引用传递

评论

4赞 wohlstad 7/6/2023
%d是 ing an ,而 是 。您还需要检查 的返回值。有关详细信息,请参阅文档scanfintplaygameboolscanf

答:

4赞 chqrlie 7/6/2023 #1

将 to 的地址传递给 for conversion 说明符,该说明符需要指向 的指针。这具有未定义的行为。一个可能的解释是在将 A 写入目标地址时覆盖了数组的内容,从而导致内存损坏。boolscanf()%dintscanf()boardint

定义为 .playgameint

这是一个修改后的版本:

#include <stdio.h>

void printboard(const char *board) {
    printf("  %c |  %c |  %c \n", board[0], board[1], board[2]);
}

int main(void) {
    char board[3] = { 'a', 'b', 'c' };

    for (;;) {
        int playgame;

        printboard(board);
        board[0] = 'a';
        board[1] = 'b';
        board[2] = 'c';
        // read an int from the user, check for conversion success
        // break from the loop if conversion failure or value entered is 0
        if (scanf("%d", &playgame) != 1 || !playgame)
            break;
    }
    return 0;
}
1赞 ryyker 7/6/2023 #2

FWIW,C 语言中没有 bool 的格式说明符,for (or )。
尽管您的示例代码可能不是这种情况,但如果您必须使用以下任一方法( 或 )捕获 a 的值,请定义一个 类型的临时容器,然后将捕获的值赋回变量中:
scanfprintfboolscanfprintfintbool

bool playgame = false;
int temp = 0;

if(scanf("%d", &temp) == 1)
{
     playgame = temp;
     ...

如暗示的那样,这仅供一般参考,并不能为您的特定需求提供解决方案。另一个发布的答案清楚地提供了这一点。(+1)