2015-03-26 2 views
2

Код компилируется и работает очень хорошо, если только я не укажу только одну опцию командной строки, тогда это будет segfaults.C - Дефект сегментации с argv

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


void printHelp() 
{ 
    printf("Usage: fstring [ char ] [ amount ] Optional:[ outfile ]\n" 
      "Example: fstring A 100 out.txt\n"); 
    exit(1); 
} 

char *f_string(const char *s, int t) 
{ 
    int i; char *dst = malloc(t * strlen(s) + 1); 
    for(i = 0; i < t; i++) { 
     strcat(dst, s); 
    } 
    return dst; 
} 


int main(int argc, char *argv[]) 
{ 
    if(argc < 2) { 
     printf("You need at least two arguments!\n"); 
     return 1; 
    } 

    char *res = f_string(argv[1], atoi(argv[2])); 
    puts(res); 
    free(res); 
    return 0; 
} 

Как я уже сказал, если я дам ему два аргумента, он работает, и если я не дам ему ни он выводит сообщение об ошибке, но придав ему только один вызывает Segfault. Я не понимаю, почему.

+0

пут '* ДСТ = 0 ', прежде чем для петли на' f_string ' – BLUEPIXY

ответ

3

ARGC - аргумент графа

ARGV - значение Arg в

Изменение:

if(argc < 2) { 

To:

if(argc < 3) { 

Подробнее о командной строке арг здесь:

http://www.cprogramming.com/tutorial/c/lesson14.html

+1

Ничего себе, это было просто. Благодарю. – user3408678

+1

Проблема заключается в том, что 'argc' - это не количество аргументов (если бы это был код OP), а число args плюс 1. Другими словами,' argc' является длиной вектора argv , не считая завершающего NULL. – user4815162342

+0

@ user3408678 Помогло ли это решить вашу проблему? –

7

В argc содержит количество аргументов, переданных программе увеличилось на 1, то тест должен быть if (argc < 3).

(argc это длина argv массива, который включает в себя имя программы в качестве argv[0]. Полезный мнемонические является то, что argv[argc] всегда равен NULL.)

+0

Я никогда не знал, что 'argv [argc]' будет 'NULL'. Итак, это правда? Argv [argc] == argv [argc + 1] == argv [argc + 2] == ... == NULL'? –

+0

@CoolGuy Нет, 'argv [argc + 1]' и выше являются неопределенным поведением. 'argv' заканчивается одним указателем NULL, который позволяет ему передавать функции без' argc' (которые могут быть вычислены из 'argv', когда это необходимо). Подумайте об этом как эквивалент указателя нулевой строки. – user4815162342

 Смежные вопросы

  • Нет связанных вопросов^_^