2014-02-10 2 views
1
)

현재 CS 랩을 코딩하려고하는데 볼 수없는 세그먼트 오류가 발생합니다. 나는 바보 같은 짓을하고 있나? 코드는 명령 행 args ("blah.exe hello world")를 취하여 주위에 배너로 출력해야합니다. 우리 수업에는 C에 대한 사전 지식이 없지만 데이터 구조에 대한 사전 강좌가 있습니다.C 세그먼트 화 오류 (오류 코드

예 출력

=============== 
= hello world = 
=============== 

자료 : 간단히 명령 줄 인수를 매개 변수없이 실행 만 추가하는 GCC -std = C99 -Wall bannerize.c

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

int main(int argc, char* argv[]) { 
     if(argc <= 1) { 
       return EXIT_FAILURE; 
     } 

     printf("TEST"); 
     int row_length = argc + 3; //3 for space after last word and 2 extra border chars 
     for(int i = 1; i < argc; i++, row_length += strlen(argv[i])); 

     printf("TEST2"); 
     char c; 
     while((c=getchar())!=EOF) { 
      printf("TEST3"); 
      for(int i = 1; i < argc; i++, printf("%c", c)); 
      printf("\n"); 

      printf("%c ", c); 
      for(int i = 1; i < argc; i++, printf("%s ", argv[i])); 
      printf("%c\n", c); 

      for(int i = 1; i < argc; i++, printf("%c", c)); 
      printf("\n"); 
    } 

    return EXIT_SUCCESS; 
} 

작품 벌금 컴파일입니다 아무것도 인쇄하기 전에 세분화 오류가 발생합니다.

+4

_ 무엇이든 인쇄하기 전에 세그멘테이션 오류가 발생했습니다 ._ 인쇄 명령문이 출력을 플러시하지 않기 때문에 사실인지 모릅니다. 더 나은 정보를 얻으려면'printf ("TEST \ n");와 같이 각각의 끝에'\ n'을 추가하십시오. 또는'fflush (stdout);을 통해 수동으로 출력을 플러시하십시오. – mah

+1

적어도'c'는'int'를 선언하고 싶을 것입니다. 'int '를 반환하는'getchar'외에'EOF'는'char'에 적합하지 않으므로'while'은 끝나지 않을 것입니다. – Kninnug

답변

5
for(int i = 1; i < argc; i++, printf("%s ", argv[i])) 

이것은 for를 작성하는 이상하고 뒤틀린 방법입니다. i == argc - 1 일 때 어떤 일이 일어나는지 생각해보십시오. 증분하면 argv[argc]에 액세스합니다. 반드시 NULL입니다. 대신에를 작성의 비밀 (! ZING) 방식의

, 실제 몸을 사용해보십시오 :

for(int i = 1; i < argc; i++) { 
    printf("%s ", argv[i]); 
} 

캐치는 몸 상태 (i > argc)이 보유하고있는 경우에만 실행되는 것입니다.

+1

출력이 플러시되기 전에'for (int i = 1; i Nabla

+0

나는 다른 포스트에서 그 루프를 보았고 항상 한 라인을 좋아했다. 나는 ++가 print 서술문과 함께 실행될 것이라는 것을 깨닫지 못했다. 나는 시체가 여기에서 시작한다는 것을 알았지 만 i ++와 함께 실행되는 것 같아, 맞습니까? – CrypticStorm

+0

@CrypticStorm "쉼표 연산자"입니다. 거의 필요하지 않습니다. – cnicutar