2015-01-19 2 views
0

지정된 길이의 모든 라인을 선택해야하는 필터를 작성하고 있습니다. 나는이 코드를 가지고 끝내지 만, n을 지정하는 방법을 모른다. 즉, n (및 선택적으로 m)을 명령 프롬프트에서 여러 행으로 대체해야하지만 코드에서이를 설명하는 방법을 모릅니다. 나는 case "%d"을 생각했지만, 내가 아는 바로는 그렇게 쓰는 것은 불가능합니다. 이것이 내가 지금까지 가지고있는 코드입니다 :길이가 C 인 필터를 선택하십시오.

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

int main(int argc, char *argv[]) 
{ 
    int n; 
    int m; 
    char line[200]; 
    while(fgets(line,sizeof(line)/sizeof(char), stdin)!=NULL) 
     { 
      if(argc>1){ 
     switch(argv[0][0]) 
     { 
     case 'n': 
     strlen(line)==n; 
     break; 

     case '#n': 
     strlen(line)<n; 
     break; 

     case 'n m': 
     strlen(line)>=n && strlen(line)<=m; 
     break; 

     case 'n#': 
     strlen(line) > n; 
     break; 
    } 
    printf("%s\n", line); 
      }} 
    return 0; 
} 

당신의 도움은 내게 많은 의미가 있습니다! 나는 더 이상 작동시키지 못한다.

+1

'sizeof (char)'는 항상 1입니다. 이는 C 표준에서 요구하고 있으며 구현 방식에 따라 평가되기 때문에 기대 한 바가 아닐 수도 있습니다. –

+0

스위치를 놓거나 argv [0] [0]과 argv [0] [1]을 검사 할 수 있습니다 ... –

+2

''n m ''은 문자열이므로''''''''''! ! 그리고'switch()'블록의'case'는 ** const-integral-expressions **이어야합니다! ** !! 왜'if()'문장을 사용하지 않을까요 ?? –

답변

0

루프 밖에서 명령 줄을 구문 분석해야한다고 생각합니다. 프로그램의 호출자가 명령 행에 nm을 지정하도록 요구할 경우 처음 두 매개 변수를 가져 와서 정수로 변환 한 다음 표준 입력을 반복하면됩니다. 이런 식으로 뭔가 : 당신을 가정

/* call this minmax.c */ 
#include <stdlib.h> 
#include <stdio.h> 
int main(int argc, char* argv[]) { 
    int n, m, len; 
    char line[200]; 

    if (argc < 3) { 
     printf("Must specify min & max line length."); 
     return -1; 
     } 

    n = atoi(argv[1]); 
    m = atoi(argv[2]); 

    while(fgets(line, 200, stdin) != NULL) { 
     len = strlen(line); 
     if (len >=n && len <= m) 
      printf(line); 
     } 
    return 0; 
    } 

이 * nix에서 스크립트에서 실행됩니다

cc -ominmax minmax.c 
다음

최소 및 최대 라인으로 전화가

./minmax 2 5 

이 당신에게 모든 라인을 다시 메아리 길이 유형은 최소 2 자 이상 5 이상이어야합니다.

+0

으악 (나는 바보 같지 않니). 제안한대로 편집되었습니다. – user590028

+0

안녕하세요, 대단히 감사합니다.하지만 불행히도 코드를 실행하려고하면 프로그램이 중단됩니다! 나는 그것을 세 번 확인하고 약간의 변화를 추가했지만 아직 효과가 없을 것입니다. 나는 그것을 실행할 때 두 가지 논점을 먼저 써야합니다. n & m, 맞습니까? (나는 예를 들어 10과 4를 쓴다). 그런 다음 프로그램이 충돌합니다. 어쩌면 내가 뭔가 잘못하고있는 걸까요? 나는 scanf를 추가하려고 시도했지만 아무것도 바뀌지 않았습니다. – Jake

+0

작은 오타가 수정되었으며 컴파일 및 실행 방법의 예가 제공되었습니다. – user590028

0

원하는 목표를 잘 이해하고 있기를 바랍니다. 여기에 프로그램 코드입니다 :

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

int main(int argc, char *argv[]) 
{ 

     int i=1,n,m; // n and m are the variable which holds 
        // the limited length 
     if(argc>=3) 
     { 
      // you need to execute the program with this form 
      // program.exe n m <file.txt 
      n=atoi(argv[1]); // get the value of n 
      m=atoi(argv[2]); // get the value of m 
      printf("n=%d m=%d\n",n,m); 
     } 
     char line[1000]; // this variable will hold each line of the file 
     while (fgets(line,sizeof(line),stdin)) // fgets used to read          
     {         //the lines in file till the newline 
      int length=strlen(line)-1; 
      // we decrement the length to get rid of 
      // the newline character 
      if (length < n) 
      { 
       printf("line %d:%s status: < %d\n",i,line,n); 
      } 
      else if (length==n) 
      { 
       printf("line %d:%s status: = %d\n",i,line,n); 
      } 
      else if (length>n && length <=m) 
      { 
       printf("line %d:%s status: %d < <= %d\n",i,line,n,m); 
      } 
      else 
      { 
       printf("line %d:%s status: > %d\n",i,line,m); 
      } 
      i++; 
     } 


    return 0; 
} 

당신이 필요로하는 모든 것을 포함 같은 경우 코드가 나는 그것이 충분하다 생각하고 정확한 프로그램에 대한 지원으로 수행 할 수 있습니다 여러분의 필요에 적합하지 않습니다! 희망이 도움이 !!

+0

개행 문자가 포함되지 않았을 수 있습니다. – BLUEPIXY

+0

네, 실제로 vim과 gedit 같은 마지막 줄에 특히 사용되는 편집기에 따라 다릅니다 !! 그가 그것을 검사 할 수있는 변수의 크기를 초과한다면 그것은 또한 라인의 크기에 달려있다 !! 필자는 파일의 내용과 그가 사용하는 편집기에 대해 알지 못하기 때문에 결국 코드를 ​​변경해야한다고 말했어 !! –

+0

@Meninx이 코드를 실행하고 몇 가지 변경 사항을 추가했지만 아직 작동하지 않았습니다. 전체 파일을 열고 닫는 것이므로 이전에는 사용하지 않았기 때문에 원하는대로 수정할 수 없었습니다. . 하지만 전반적인 아이디어를 얻었고 이전 코드를 향상시키기 위해 일부 부품을 사용했습니다 (작별 인사 스위치!). 정말 고마워요! 진지하게, 특히 코멘트와 함께, 그것은 매우 도움이되었다. 감사! – Jake

관련 문제