2016-02-11 3 views
1

Я не могу понять, что не так в моем коде, когда дело доходит до первого scanf во время цикла, я ввожу число, и оно просто останавливается там.Программа останавливается при сканировании

Если я положил printf («Что-то»); после этого scanf он не печатается, поэтому он не является бесконечным циклом. Также программа не просто замерзает, когда я заходила в диспетчер задач, она обрабатывает процессор, поэтому он что-то делает.

Моя программа должна нагружать резисторы и вычислять их параллельный эквивалент, пока я не набираю «done», а затем распечатываю вычисленное число.

#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; 
} 
+1

'for (c = -1; s [c]; C++);' accesses 's [-1]', который может быть 0, что означает, что 'ci' в' power (i, ci) 'отрицательно , и, следовательно, 'while (pows) {pows -}' должен пройти через 2^64 петли, которые могут занять некоторое время. Ваша программа не должна принимать измеримое время процессора. Btw, вы делаете 'n ++' в 'do..while', обращаясь к' convertnum [n] ', но вы только' malloc (1 * sizeof (int)) '. О, 'printf (« Something \ n »);' после того, как scanf должен показать некоторый вывод. – Kenney

+0

Ах, правильно. Я не думал об этом, мне нужно было уменьшить c, поэтому я положил его туда. Это заставляет программу работать нормально и показывать другие ошибки: D. Вы должны были ответить им. – Nebeski

+0

Также n равно 0, поэтому как преобразовать num [0] в проблему? В первом цикле я имею в виду. – Nebeski

ответ

1

for(c=-1;s[c];c++); обращается с [-1], что может быть 0, что означает c-i в power(i,c-i) имеет отрицательное значение, и, таким образом while(pows){pows--} должен пройти через 2^64 петель, которые могут занять некоторое время. Ваша программа не должна принимать измеримое время процессора.

Смежные вопросы