1

你好我有一个litlle问题。我试图制作一个银行等待时间程序,但是当我用 scanf() 读取 0 值时,它没有读取或读取错误。我做了一些搜索,但注意到这解决了我的问题。

这是代码..它是C语言的。

#include <stdio.h>
int main(){
int c, n, t,i,d;//entradas do usuário (caixas, usuários, momento de chegada, tempo de atendimento
int menor_espera=0;// caixa de menor tempo de espera
int tempo_maximo = 20;// tempo maximo de espera por atencimento
int resultado=0;//Numero de pessoas com mais de 20 minutos de espera por atendimento

scanf(" %u %u %*c\n", &c, &n);// Lê o numero de caixas, numero de clientes no dia
if(c>0 && n>0){//iniciação só com valores positivos e possiveis c>1, n>1 (1 caixa e um cliente)
    int caixa[c];// declara o um vetor de caixas
    for(i=0;i<n;i++){// Loop de numero de usuários
    scanf(" %u %u %*c\n", &t, &d);//Lê um cliente (T e D)
    printf("print: %u %u\n", c, n);
        int j;
        for(j=0; j<c;j++){// loop de caixas
            if(caixa[j]<caixa[menor_espera]){//chaca se o caixa atual é o primeiro caixa disponivel (caixa com menos tempo de uso)
                menor_espera = j;//positivo, atualiza o caixa de menor espera
            }
        }if(caixa[menor_espera]-t>tempo_maximo){//checa se o cliente terá de esperar mais que o tempo maximo para ser atendido baseado na sua chegada
            resultado++;//positivo, atualiza o contador de usuário que esperaram mais que o tempo maximo
        }caixa[menor_espera] += d;// atualiza o tempo de uso do caixa que foi utilizado
    }
    printf("Resultado final: %d\n", resultado);// exibe resultado final
}getch();

}

这是一个输入

1 16
0 10
0 10
0 10
3 10
5 10
7 10
11 10
13 10
14 10
15 10
16 10
17 10
18 3
19 10
20 10
23 3

这就是我的输出

print: 10 0
print: 0 0
print: 0 3
print: 0 5
print: 0 7
print: 0 11
print: 0 13
print: 0 14
print: 0 15
print: 0 16
print: 0 17
print: 0 18
print: 19 10
print: 0 10
print: 3 3
print: 3 3
Resultado final: 16

但它不应该是这样的。

感谢任何帮助。如果我找到了解决方案,我会在这里发布。

4

2 回答 2

2

一个问题是您没有捕获或测试来自scanf(). 它返回它解析的项目数,或在 i/o 错误时返回 -1。

考虑这样的事情至少找出这是否可能是一个问题:

if (scanf(" %u %u %*c\n", &t, &d) < 2)  //Lê um cliente (T e D)
     printf ("input conversion or i/o error\n");
于 2013-04-15T22:13:36.253 回答
2

这是有问题的:

scanf(" %u %u %*c\n", &c, &n);

它查找两个数字、一些空格和一个被忽略的非空格字符,然后是更多的空格(可能是也可能不是换行符)。

给定您的输入文件,第一个scanf()内容为:

1 16
0

下一个要读取的字符将是1第二10行数据的 。这就是你有问题的原因。

用于fgets()一次读取一行,并sscanf()解析该行。并测试两者的结果fgets()sscanf()(或者scanf()如果你坚持使用它)。

这是您需要的近似值。

#include <stdio.h>

int main(void)
{
    int c, n, t,d;
    int menor_espera = 0;
    int tempo_maximo = 20;
    int resultado = 0;
    char line[4096];

    if (fgets(line, sizeof(line), stdin) != 0)
    {
        if (sscanf(line, "%u %u", &c, &n) != 2)
            return(1);
        if (c > 0 && n > 0)
        {
            int caixa[c];   // VLA - uninitialized
            for (int i = 0;i < n; i++)
            {
                if (fgets(line, sizeof(line), stdin) == 0)
                    break;  // EOF or error
                if (scanf(line, "%u %u", &t, &d) != 2)
                    break;  // EOF or error
                printf("print: %u %u\n", c, n);  // Not t and d??
                for (int j = 0; j < c; j++)
                {
                    // Accessing uninitialized data in caixa array!
                    if (caixa[j] < caixa[menor_espera])
                        menor_espera = j;
                }
                if (caixa[menor_espera] - t > tempo_maximo)
                    resultado++;
                caixa[menor_espera] += d;
            }
            printf("Resultado final: %d\n", resultado);
        }
    }
    return(0);
}

我认为原始代码中存在一些逻辑错误(一些用注释突出显示),但我不确定应该更正什么。

于 2013-04-15T22:20:33.743 回答