C中的for循环和char
Posted
技术标签:
【中文标题】C中的for循环和char【英文标题】:for loop and char in C 【发布时间】:2012-06-02 16:36:55 【问题描述】:我正在努力学习 C 语言,在这里我需要一些帮助。
我正在尝试为井字游戏制作程序。我尝试在 main 函数中执行它的第一部分,但它不起作用。但是,当我使用另一个功能时,它起作用了。它是如何以及为什么起作用的? (两个程序都附在下面)。
另外,我在带有“square 1”和“square 2”的 scanf 中使用了“%s”而不是“%c”。 为什么“%c”在这里不能正常工作?
提前感谢您的帮助。
// first program
#include <stdio.h>
int main ()
int player;
char square1;
char square2;
char Nesta[9]='1','2','3','4','5','6','7','8','9';
int player1;
int player2;
printf("choose one for x or two for o\n");
scanf("%i", &player);
if (player==1)
player1='x';
player2='o';
else
player1 ='o';
player2='x';
printf(
"1 + 2 + 3 \n"
"---+----+-----\n"
"4 + 5 + 6 \n"
"---+----+-----\n"
"7 + 8 + 9 \n"
);
for (int i=0; i<3; ++i)
printf("please enter the number of the sqaure ");
scanf("%s",&square1 );
printf("please enter the number of the sqaure ");
scanf("%s",&square2 );
for (int j=0; j<9; ++j)
if (square1 == Nesta[j])
Nesta[j]=player1;
printf(
"%c + %c + %c \n"
"----+-----+--- \n"
"%c + %c + %c \n"
"----+-----+--- \n"
"%c + %c + %c \n", Nesta[0],Nesta[1], Nesta[2], Nesta[3],Nesta[4],Nesta[5],Nesta[6],Nesta[7],Nesta[8]);
for (int k=0; k<9; ++k)
if (square2 == Nesta[k])
Nesta[k]=player2;
printf(
"%c + %c + %c \n"
"----+-----+--- \n"
"%c + %c + %c \n"
"----+-----+--- \n"
"%c + %c + %c \n", Nesta[0],Nesta[1], Nesta[2], Nesta[3],Nesta[4],
Nesta[5],Nesta[6],Nesta[7],Nesta[8]);
return 0;
在使用gamecont功能时效果很好!!
// the second program
#include <stdio.h>
char Nesta[9]='1','2','3','4','5','6','7','8','9';
int player1;
int player2;
int gamecont ()
char square2;
printf("please enter the number of the square ");
scanf("%s",&square2 );
for (int j=0; j<9; ++j)
if (square2 == Nesta[j])
Nesta[j]=player2;
printf(
"%c + %c + %c \n"
"----+-----+--- \n"
"%c + %c + %c \n"
"----+-----+--- \n"
"%c + %c + %c \n", Nesta[0],Nesta[1], Nesta[2], Nesta[3],Nesta[4],
Nesta[5],Nesta[6],Nesta[7],Nesta[8]);
int main ()
int player;
char square1;
printf("choose one for x or two for o\n");
scanf("%i", &player);
if (player==1)
player1='x';
player2='o';
else
player1 ='o';
player2='x';
printf(
"1 + 2 + 3 \n"
"---+----+-----\n"
"4 + 5 + 6 \n"
"---+----+-----\n"
"7 + 8 + 9 \n"
);
for (int i=0; i<3; ++i)
printf("please enter the number of the square ");
scanf("%s",&square1 );
for (int j=0; j<9; ++j)
if (square1 == Nesta[j])
Nesta[j]=player1;
printf(
"%c + %c + %c \n"
"----+-----+--- \n"
"%c + %c + %c \n"
"----+-----+--- \n"
"%c + %c + %c \n", Nesta[0],Nesta[1], Nesta[2], Nesta[3],Nesta[4],Nesta[5],Nesta[6],Nesta[7],Nesta[8]);
gamecont() ;
return 0;
【问题讨论】:
请缩进你的代码! 我的意思是正确的 - 有多余的行,新范围内没有空格等。您只是使用 *** 按钮对其进行了格式化,它距离正确缩进还很远。帮助我们帮助您! 这个scanf("%s",&square1 );
不仅不安全,而且是未定义的行为。如果它没有做任何有趣的事情(比如格式化硬盘),它会在 square1
旁边写入 0 终止符,踩踏任何不幸存储在那里的数据。
【参考方案1】:
当你说某事“不起作用”时,你需要清楚。在什么意义上不起作用?电脑坏了?或者发生了一些你没有预料到的具体事情?然后具体一点。
WRT %c
vs %s
,请记住,当您从控制台输入数据时,您需要点击“enter”,这会将 '\n' 字符输入到标准输入缓冲区。 那个 '\n' 仍在输入缓冲区中,等待下一个 scanf
读取。
当您使用%s
时,如果缓冲区中有换行符,则会跳过该换行符,因为%s
字符串不包含空格,并且大多数类型说明符都会跳过前导空格。但是,%c
始终是单个字符。考虑:
char c;
while (scanf("%c", &c)) printf("%d\n", c);
每次您输入一个字符(然后按 Enter),您都会得到 两个 数字,其中第二个是 10 (ascii \n
)。
很遗憾,您对 %s 的使用是不安全的。试试这个:
scanf("%c%*c", &square);
*
表示忽略,因此这将删除换行符,使标准输入缓冲区为空。但是,如果用户输入了多个字母(或空格),仍然会留下一些东西。您可以将square
设为字符串并只使用第一个字符,但这也有缺陷。刷新输入缓冲区的一种可靠方法是:
while (fgetc(stdin) != '\n');
如果您在使用 scanf 后这样做,它会在您捕获后吃掉缓冲区中的任何内容,并在下一次时将其清除。
【讨论】:
我没有足够的声望来支持你的答案:)。谢谢你。你说的很清楚。【参考方案2】:在第一个代码转储中,您将带有 %s 的 c 字符串扫描到字符变量(square1 和 square2)。这是不安全的,您应该将 c 字符串扫描到字符数组,而不是单个字符。
【讨论】:
以上是关于C中的for循环和char的主要内容,如果未能解决你的问题,请参考以下文章