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",&amp;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的主要内容,如果未能解决你的问题,请参考以下文章

C - for循环和循环嵌套

C中的for循环和char

for 循环中的 C++ 参考

c语言中的循环的嵌套是怎么运行的

JS中如何解决for循环中的延迟执行问题

c != '\n' 条件在“for”循环(C 语言)中的作用是啥?