2017-09-21 1 views
3

포럼을 통해 조사했지만 내 상황에 적용되는이 질문에 대한 답을 찾지 못했습니다. 그러나 'sort'(유닉스)를 사용하는 시스템 호출을하려고하는데 "레이블은 명령문의 일부일뿐 선언은 명령문이 아닙니다."라는 오류 메시지가 나타납니다. 다음은 오류를 일으키는 코드입니다.레이블은 명령문의 일부로 만 사용될 수 있습니다. 오류

int processid; 
switch(processid = fork()){     //establishing switch statement for forking of processes. 
case -1: 
    perror("fork()"); 
    exit(EXIT_FAILURE); 
    break; 
case 0: 
    char *const parmList[] = {"usr/bin/sort","output.txt","-o","output.txt",NULL}; //execv call to sort file for names. 
    break; 
default: 
    sleep(1); 
    printf("\nChild process has finished."); 
} 

시스템 호출에서 이름순으로 단순히 용어를 모으기 위해 알파벳순으로 파일을 정렬하려고합니다.

내 execv 시스템 호출에 대한 명령이 들어있는 char * const에서 발생하는 오류로 인해 나는 너무 놀라워. 이 EXACT switch 문은 다른 프로그램 파일에서 작동합니다. 누군가 내가 놓친 것을 발견 할 수 있습니까? 감사합니다.

+2

'sort'는 시스템 호출이 아닌 일반 프로그램입니다. 그리고 선언은 블록이없는 'switch'문은 어쨌든 매우 나쁜 생각입니다. 좋은 C 책은 분명히 할 수있다. ** 왜 **. Sidenote : 배열에'const'을 사용하는 이유는 무엇입니까? 문자열 리터럴을 변경하면 안됩니다. 그리고 그 프로그램을 어디서 실행합니까? [mcve]를 제공하십시오. – Olaf

+0

유닉스 특유의 질문은? 없는 경우 관련이없는 태그로 스팸하지 마십시오. – Gerhardh

+0

무엇이 오류 메시지에 대해 당신을 놀라게하고 있습니까? 그것은 꽤 분명하게 쓰여졌습니다. –

답변

5

C (C++의 반대) 선언은 not 문입니다. 레이블은 명령문보다 앞에 올 수 있습니다. 당신은 라벨

case 0: 
    ; 
    char *const parmList[] = {"usr/bin/sort","output.txt","-o","output.txt",NULL}; //execv call to sort file for names. 
    break; 

후 널 문을 삽입 예를 들어 쓸 수 있습니다 또는 당신은 첫 번째 경우에서 변수의 범위는 스위치가 있음을 고려

case 0: 
    { 
    char *const parmList[] = {"usr/bin/sort","output.txt","-o","output.txt",NULL}; //execv call to sort file for names. 
    break; 
    } 

중괄호의 코드를 동봉 수 두 번째 경우 변수의 범위는 레이블 아래의 내부 코드 블록입니다. 변수에는 자동 저장 기간이 있습니다. 따라서 해당 코드 블록을 종료 한 후에는 작동하지 않습니다.

+0

내 케이스 콜론 다음에 또 다른 세미 콜론을 추가 한 것일뿐입니다. 왜 이것이 블라드인지 설명해 주시겠습니까? – BologneseBandit

+0

@BologneseBandit 세미콜론이 Null 문을 사용합니다. –

+0

죄송합니다. 내가 틀렸어.이 말이 맞아. 매일 새로운 것을 배우십시오. upvote을 가져라! – Bathsheba

0

레이블 아래에 변수를 정의 할 때 변수의 범위를 말해야합니다 (중괄호 사용).

int processid; 
switch(processid = fork()) 
{     //establishing switch statement for forking of processes. 
    case -1: 
     perror("fork()"); 
     exit(0); 
     break; 
    case 0: 
    { 
     char *const parmList[] = {"usr/bin/sort","output.txt","-o","output.txt",NULL}; //execv call to sort file for names. 
     break; 
    } 
    default: 
     sleep(1); 
     printf("\nChild process has finished."); 
} 
관련 문제