【问题标题】:Program stops at scanf程序在 scanf 处停止
【发布时间】:2016-05-22 23:24:51
【问题描述】:

我似乎无法弄清楚我的代码有什么问题,当谈到 do while 循环中的第一个 scanf 时,我输入了一个数字,它就停在那里。

如果我把 printf("Something");在那次scanf之后,它没有被打印,所以它不是一个无限循环。另外程序不只是冻结,当我进入任务管理器时,它会占用 CPU,所以它正在做一些事情。

我的程序应该加载电阻并计算它们的并联等效值,直到我输入“完成”,然后打印出计算出的数字。

#include <stdio.h>
#include <stdlib.h>

typedef struct o{char om[20];}RESISTOR;

int finish(char *s)
{
    if( s[0]=='d' && s[1]=='o' && s[2]=='n' && s[3]=='e' && s[4]==0 )
        return 0;
    else return 1;
}

int power(int n, int pows)
{
    int expo=1;
    while (pows)
    {
        expo*=n;
        pows--;
    }
    return expo;
}

int convert(char *s)
{
    int broj,c;for(c=-1;s[c];c++);
    for(int i=0;s[i];i++)
        {broj+=(s[i]-0x30)*power(10,c-i);}
    return broj;
}

double paralel(double old, int new)
{
    double num;
    num=((double)new*old)/(old+(double)new);
    return num;
}

int main()
{
    int n=0;double para;
    RESISTOR *p=(RESISTOR *)malloc(1*sizeof(RESISTOR));
    int *convertnum=(int *)malloc(1*sizeof(int));
    do
    {
        printf("R%d= ",n+1);
        scanf(" %s", (p+n)->om);
        convertnum[n]=convert((*(p+n)).om);
        if(n==0) para=convertnum[n];
        else if (finish((*(p+n)).om)) para=paralel(para,convertnum[n]); 
        n++;
        if(finish((*(p+n-1)).om))
            {
                p=(RESISTOR *)realloc(p, n*sizeof(RESISTOR));
                convertnum=(int *)realloc(convertnum, n*sizeof(int));
            }
    }while(finish((*(p+n-1)).om));

    printf("\n");printf("\n");
    printf("Re= %.2f",para);
    free(p);free(convertnum);
    printf("\n");
    return 0;
}

【问题讨论】:

  • for(c=-1;s[c];c++); 访问s[-1],可能为0,这意味着power(i,c-i) 中的c-i 为负数,因此while(pows){pows--} 必须经过2^64 个循环,这可能需要一会儿。您的程序不应占用任何可测量的 CPU 时间。顺便说一句,你在do..while 中做n++,访问convertnum[n],但你只有malloc(1*sizeof(int))。哦,printf("Something\n"); 在 scanf 之后应该会显示一些输出。
  • 啊,正确。我没想到,我需要减少 c 所以我把它放在那里。这使程序现在运行良好,并显示其他错误:D。你应该把它作为答案。
  • 那里的n也是0,那么convertnum[0]怎么会有问题呢?我的意思是在第一个循环中。
  • 不,不是问题——你分配一个。但是当n=1 时,您的程序会以未定义的方式运行。
  • 但是你在结尾看到了,我说 (p+n-1) 和 realloc 中的另一个 n 应该在那里增加一..

标签: c scanf


【解决方案1】:

for(c=-1;s[c];c++); 访问 s[-1],它可能为 0,这意味着 power(i,c-i) 中的 c-i 为负数,因此 while(pows){pows--} 必须经过 2^64 次循环,这可能需要一段时间。您的程序不应占用任何可测量的 CPU 时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    相关资源
    最近更新 更多