2017-02-08 3 views
-1
#include <stdio.h> 
#include <string.h> 

int convert(char *str) 
{ 
    int i, number = 0; 
    for (i = 0; str[i] != '\0'; ++i) { 
    number = number * 10 + str[i] - '0'; 

    } 
    return number; 
} 

int main(int argc, char *argv[]) 
{ 
    int j; 
    int c = convert(argv[2]); 
    if (argc == 3) { 
    for (j = 0; j < c; j++) { 
     printf("Hello, %s!\n", argv[1]); 
    } 
    } else if (argc < 3) { 
    printf("Not Enough Arguments\n"); 
    } else if (argc > 3) { 
    printf("Too Many Arguments\n"); 
    } 
    return 0; 
} 

3 개 이하의 인수를 줄 때 세그먼트 오류가 발생합니다. 3 개 이하의 인수를 지정하면 "인수가 충분하지 않습니다"가 출력되지만 오류 세그먼트 화 오류가 발생합니다.c 명령 줄 인수

입력 : ./a raju 예상 출력 :

+8

확인하기 전에'argv [2]'를 사용하는 것은 나쁜 생각 인 것 같습니다. ... 정말로, 여러분은 자신의 코드를 읽을 수는 없습니까? –

답변

2
int c = convert(argv[2]); 

argc는 2 not enough arguments, argv[2]NULL 것이다. 이 코드 라인은 프로그램이 실행될 때 제일 먼저 실행되는 것처럼 무엇을 기대합니까?

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

int convert(char *str) 
{ 
    int i, number = 0; 
    for (i = 0; str[i] != '\0'; ++i) { 
    number = number * 10 + str[i] - '0'; 
    } 
    return number; 
} 

int main(int argc, char *argv[]) 
{ 
    if (argc != 3) { 
    printf( argc < 3 ? "Not Enough Arguments\n" 
      /*argc > 3*/ : "Too Many Arguments\n" ); 
    exit(EXIT_FAILURE); 
    } 

    int c = convert(argv[2]); 
    for (int j = 0; j < c; j++) { 
    printf("Hello, %s!\n", argv[1]); 
    } 
    return 0; 
} 

추신 :

리팩토링 그 아래 조건문이 해당 조건에 대한 보호를 형성하도록, 여기 당신은 아마 의도에 가까운 뭔가 argv[0]은 일반적으로 인수가 아닌 프로그램 이름이기 때문에 과 argv[2]이 인수가되고 argv[3]NULL이 될 것이며,이 개수를 계산하면 3이 아니라 2가됩니다. 3 개의 인수가 주어지면 argc == 4을 기대하십시오.

0

getopt.h library에 관심이 있으실 것입니다. 명령 줄 인수의 모든 표준 기능을 처리합니다.