C语言 数组为空时结束循环

xj3cbfub  于 2022-12-03  发布在  其他
关注(0)|答案(2)|浏览(275)

为了解决我的问题,我需要在str2为空的情况下退出while循环。

while (elementos <= tamanho - jogada || str2 == NULL);

这是代码:

#include <stdio.h>
#include <string.h>

#define BUFFER 100

unsigned int randaux() {
    static long seed = 1;
    return (((seed = seed * 214013L + 2531011L) >> 16) & 0x7fff);
}

/* Implementação do procedimento MostraLamberta */

unsigned int MostraLamberta(int *tabuleiro, int tamanho) {
    int i, casa, elementos;
    int jogada = 0;
    char novostr[BUFFER], str2[BUFFER];    /* novo vetor para receber os char */
    do {
        scanf("%d %d", &casa, &elementos);
        for (i = 0; i < tamanho; i++) {    /*Loop para percorrer o int tabuleiro um a um */
            if (tabuleiro[i] == 0) {       /*Comparar se for 0 vai para o vetor como O */
                novostr[i] = 'O';
            } else {            /* Se não vai para o vetor como X */
                novostr[i] = 'X';
            }
        }
        if (tamanho >= 10) {
            novostr[i] = '\0';
            for (i = 1; i < tamanho; i++) {
                if (i == 10) {
                    printf("%d", (i) / 10);
                } else {
                    printf(" ");
                }
            }
            printf("\n");
            for (i = 1; i < tamanho + 1; i++) {
                if (i >= 10) {
                    printf("%d", i % 10);
                } else {
                    printf("%d", i);
                }
                printf;
            }
        } else {
            for (i = 0; i < tamanho; i++) {
                if (i == 10) {
                    printf("%d", i % 10);
                } else {
                    printf("%d", i + 1);
                }
            }
        }
        printf("\n");
        novostr[i] = '\0';    /*Termina a string */
        jogada++;
        printf("%s", novostr);
        printf("\nJogada [%d]: %d %d", jogada, casa, elementos);    /*Imprime nova string */
        for (i = casa - 1; i < elementos + casa - 1; i++) {
            if (tabuleiro[i] == 0) {    /*Comparar se for 0 vai para o vetor como O */
                novostr[i] = 'X';
                tabuleiro[i] = 1;
                continue;
            } else {            /* Se não vai para o vetor como X */
                novostr[i] = 'O';
                tabuleiro[i] = 0;
                str2[i] = tabuleiro[i];
            }
            novostr[i] = '\0';

            printf("%d", str2[i]);//in here if its empty, the loop is over
        }
        printf("\n");

    } while (elementos <= tamanho - jogada || str2 == NULL);

    if (jogada % 2 == 0) {
        printf("Jogada inválida, perde jogador 2.");
    } else {
        printf("Jogada inválida, perde jogador 1.");
    }
}

void main() {
    int i, num, saltos, tamanho, tabuleiro[BUFFER];    /*Implementa as variáveis inteiras */
    scanf("%d %d", &tamanho, &saltos);

    // saltar os primeiros números aleatórios, para ter sequências distintas
    for (i = 0; i < saltos; i++)    /*Loop */
        randaux();            /*Chama a funcão randaux */

    /* Chamar o procedimento para gerar um novo tabuleiro */
    for (i = 0; i < tamanho; i++) {
        num = randaux();        /*Grava um numero aleatório numa nova variável */
        if (num % 2 == 0) {     /*VC* se o numero aleatório C) par ou impar */
            tabuleiro[i] = 0;
        } else {
            tabuleiro[i] = 1;
        }
    }

    MostraLamberta(tabuleiro, tamanho);    /*Chama a função e passa dois argumentos) */
}

[

](第一次)
[

](一个字母)

1mrurvl1

1mrurvl11#

目前还不清楚您的程式码有何作用,但有一些问题:

  • do/while循环是一种容易出错的结构。使用for (;;)(也称为for ever)循环并进行显式测试来中断它会更容易混淆,例如if (scanf("%d %d", &casa, &elementos) != 2) break;
  • 测试X1 M4 N1 X的第二部分是没有实际意义的:str2是一个数组,不能是NULL。如果要测试空字符串,请改用str2[0] == '\0'
  • str2未正确构造:它被修改的唯一位置是:str2[i] = tabuleiro[i];,但tabuleiro[i]在此语句之前设置为0,因此str2的一部分未初始化,并且修改的元素仅为空字节。
x6h2sr28

x6h2sr282#

在OP代码中,以下行进入无限循环。

while (elementos <= tamanho - jogada || str2 == NULL);

需要注意的潜在问题很少:

  • str2表达式总是非空的。回想一下在“C”中,数组的值是第一个元素的地址。如果你想测试一个字符串是否为“空”,考虑strlen(str2)== 0,或者类似的。
  • 对于str2为“非空”的任何情况,while将进入无限循环(如果elementos <= tamanho - jogada)。通常,您将看到对循环体中条件中的某个变量的修改。例如jopada++

相关问题