提问人:Filip Dvorak 提问时间:7/6/2023 最后编辑:chqrlieFilip Dvorak 更新时间:7/6/2023 访问量:58
“While 循环”(包含传递到函数中的数组的指针)只工作一次
"While loop" (contains pointer to array passed into a function) works only once
问:
我正在用 C 编写一些代码,在函数内部有一个循环,其中包含一个函数调用,用于获取指向数组的指针。在函数中,我有一个 ,它打印存储在 “ 数组中的 3 个字符。在函数中,我只有一个指针,所以我正在做指针算术。当循环首次执行时,它工作得很好。但是,当它再次执行时,它不起作用。它不打印字母。为什么?main
while
printboard
board
printf
board
while
#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;
}
答:
4赞
chqrlie
7/6/2023
#1
将 to 的地址传递给 for conversion 说明符,该说明符需要指向 的指针。这具有未定义的行为。一个可能的解释是在将 A 写入目标地址时覆盖了数组的内容,从而导致内存损坏。bool
scanf()
%d
int
scanf()
board
int
定义为 .playgame
int
这是一个修改后的版本:
#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 的值,请定义一个 类型的临时容器,然后将捕获的值赋回变量中:scanf
printf
bool
scanf
printf
int
bool
bool playgame = false;
int temp = 0;
if(scanf("%d", &temp) == 1)
{
playgame = temp;
...
如暗示的那样,这仅供一般参考,并不能为您的特定需求提供解决方案。另一个发布的答案清楚地提供了这一点。(+1)
评论
%d
是 ing an ,而 是 。您还需要检查 的返回值。有关详细信息,请参阅文档。scanf
int
playgame
bool
scanf