2015-01-08 3 views
0

안녕 충돌 : 그것은 공정 입력을 콘솔에서 읽고 밖으로 다시 제공해야합니다C 프로그램은 내 프로그램을 디버깅에 도움이 필요

오류가 occures while(scanf("%15s", input) != EOF)는 2 시간이 호출 된 후. 불행히도 나는 프로 그램이 얼어 버리고 나에게 어떤 정보도주지 않기 때문에 오류가 무엇인지 말할 수 없다. 나는 input VAR에 문제 (이 전달되는 여러 번)

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

char* repeat(char c, int n); 
char* drawLabel(char* label, int n); 
char* drawBarnorm(char* label, int value); 
char* drawBar(char* label, double value); 

int main(void) 
{ 
    char* input; 
    double numIn; 
    char buf[] = ""; 
    char* pOutput = &buf[0]; 

    while(scanf("%15s", input) != EOF) 
    { 
     scanf("%lf", &numIn); 
     if (numIn > 1) 
     { 
      if (numIn > 30) 
      { 
       printf("num to big!\n"); 
       return 0; 
      } 

      strcat(pOutput, drawBarnorm(input, (int)numIn)); 
     } else 
      {strcat(pOutput, drawBar(input, numIn));} 


     printf("%s\n", pOutput); 
    } 

    printf("%s\n", pOutput); 
    return 0; 
} 

char* repeat(char c, int n) 
{ 
    char* out = (char*)malloc(sizeof(char)*50); 
    int i, len; 
    out[0] = '\0'; 

    for (i = 0; i < n; ++i) 
    { 
     len = strlen(out); 
     out[len] = c; 
     out[len+1] = '\0'; 
    } 

    return out; 
} 

char* drawLabel(char* label, int n) 
{ 
    if (strlen(label) > n) 
    { 
     char* newLabel = (char*)malloc(sizeof(char)*(n+1)); 
     newLabel[0] = '\0'; 
     strncpy(newLabel, label, n); 
     newLabel[n] = '\0'; 
     return newLabel; 
    } else if (strlen(label) < n) 
    { 
     strcat(label, repeat(' ', n-strlen(label))); 
    } 

    return label; 
} 

char* drawBarnorm(char* label, int value) 
{ 
    char* bar = (char*)malloc(sizeof(char)*41); 
    char* barPart; 
    bar[0] = '\0'; 
    bar = drawLabel(label, 8); 
    strcat(bar, "|"); 
    barPart = drawLabel(repeat('#', value), 30); 
    strcat(bar, barPart); 
    strcat(bar, "|"); 
    return bar; 
} 

char* drawBar(char* label, double value) 
{ 
    int val = (int)(30.0*value); 
    return drawBarnorm(label, val); 
} 

이 나를 도와 주셔서 감사합니다 거기라고 생각합니다.

+2

을 통해 값을 저장하기 위해 몇 가지 유효한 메모리 위치를 가리키는해야

당신은 이전과 같은이 질문에 똑같은 실수를했다. – Sadique

+1

* 과거를 기억하지 못하는 사람들은 그것을 반복하도록 비난받습니다. * - George Santayana. –

+0

이 줄은 : '(scanf ("% 15s", input)! = EOF)'오류가 있습니다. 코드에서 실제로 찾고자하는 것은 '입력/변환이 성공적 이었습니까?'입니다. 따라서 라인을 작성하는 올바른 방법은 'while (1 == scanf ("% 15s", input))'I.E. 1 입력 변환 및 형식 문자열에서 ''를 앞에 놓으면 선행 공백 (새 줄)을 건너 뛰거나 흡수합니다. – user3629249

답변

3

당신은 당신이

을 변경해야하므로, 당신은 scanf이 인수의 수가 일치 반환 EOF을 반환하지 않는 것을주의해야 input을 초기화하거나이

char input[16]; 

같은 배열로 선언해야

while(scanf("%15s", input) == 1) 
while(scanf("%15s", input) != EOF) 

입니다. 왜냐하면 while(scanf("%15s", input) != EOF이 항상 true이기 때문입니다.

+0

Thx, 많은 도움이되었습니다. EOF로 나가면 STATUS_ACCESS_VIOLATION을 얻습니다. – user3025417

+0

EOF로 루프를 종료 할 수 있기 때문에 재미 있어요. – user3025417

+1

불가능합니다. 보내진 문자는'scanf'가 반환하는 것이 아니고, 그 경우에는'0'을 반환하지만'0! = EOF' 이후에는'input'을 초기화하지 않은 루프를 입력하면'input'에 접근하려고 할 때'UNDEFINED 귀하의 경우에 'STATUS_ACCESS_VIOLATION'이 (가) 발생하는 것입니다. –

4
char* input = malloc(size); /* Allocate memory of your wish */ 

메모리 할당 : input 포인터를 초기화하지 않았습니다. 포인터가 scanf()

+0

'무료'기능이 있다는 것을 알고 계십니까? 그리고 '크기'의 가치는 무엇이되어야 하는가? –

+0

main() 함수에서 'input'은 'char input [40]'으로 정의되어 있으므로 scanf는 ok입니다. (입력/변환이 성공적 이었음을 확인하기 위해 반환 값을 확인하는 것 이외에) – user3629249

+0

@ user3629249 왜'main()'에'char * input; –

관련 문제