2014-10-31 3 views
0

Я пытаюсь скопировать argv в массив char, был через некоторые решения в Интернете, но в итоге получил ошибку сегментации. Ниже приведен код, который я использовал:Ошибка при копировании argv в массив char

void main (int argc,const char *argv[]) 
{ 
    char *arr; 
    arr = (char *) malloc(strlen(argv[1])+1); 
    strcpy(arr,argv[1]); 
} 

Пожалуйста, помогите определить, что я делаю неправильно.

+1

Какой параметр вы указать при запуске программы? Перед распределением, копированием вы должны проверить 'argc> 1'. –

+2

Что такое 'argv [1]'? 'strlen (NULL)' приведет к UB и segfault. См. [This] (http://stackoverflow.com/q/5796103/2173917) –

+0

И вы передаете хотя бы один аргумент программе? Расскажите, как вы вызываете программу и какие аргументы вы передаете ей. –

ответ

3

Похоже, что argv [1] равен NULL или даже не существует (стандарт C допускает, что argc может быть равен 0).

Добавить следующую проверку

char *arr; 

if (argc > 1) 
{ 
    arr = (char *) malloc(strlen(argv[1])+1); 
    strcpy(arr,argv[1]); 
} 
else 
{ 
    // print some error message 
} 
+0

Дополнительная информация [здесь] (http://stackoverflow.com/q/5796103/2173917) –

+0

@Sourav Ghosh Я не понял, почему вы отклонили мой ответ. –

+0

Я только что добавил дополнительную информацию. См. Мой предыдущий комментарий. разве это не так, как урс? почему я тогда понижу? –

0

Пожалуйста, помогите определить, что я делаю неправильно.

Хорошо, сэр. Вы просите argv [1], но вы не уверены, существует ли он. доступ к массиву за пределами его границ имеет неопределенное поведение. Вы всегда должны проверить, если число параметров, что вы ожидаете, чтобы избежать неопределенного поведения:

if (argc < 2) 
{ 
    // error, cannot copy argv[1] because it doesn't exist. Explain this to user 
} 

// now OK..., also we postponed allocation of arr pointer 
char *arr = malloc(strlen(argv[1]) + 1); 
     //^^^^ 
     // no need to cast return value of malloc in C 

strcpy(arr, argv[1]); 
0

При использовании входа командной строки, мы должны иметь дело с числом аргументов.

Вы можете попробовать что-то вроде этого ..

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

void main (int argc, const char *argv[]) 
{ 
if(argc==2)//change condition based on your requirements 
{ 
    char *arr; 
    arr = (char *) malloc(strlen(argv[1])+1); 
    strcpy(arr,argv[1]); 
    printf("string is %s\n",arr); 
} 
else 
{ 
printf("check your command line input (only 2 parameters)\n"); 
} 
} 

ВЫВОД:

$ ./a.out 
check your command line input (only 2 parameters) 
$ ./a.out hello 
string is hello 
$ ./a.out hi hello 
check your command line input (only 2 parameters) 
$