Я пытаюсь скопировать argv в char array, через некоторые решения в Интернете, но в итоге получаю Segmentation Fault. Ниже приведен код, который я использовал:
void main (int argc,const char *argv[])
{
char *arr;
arr = (char *) malloc(strlen(argv[1])+1);
strcpy(arr,argv[1]);
}
Пожалуйста, помогите определить, что я делаю неправильно.
Похоже, что 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
}
При использовании ввода в командной строке мы должны иметь дело с количеством аргументов.
Вы можете попробовать что-то вроде этого..
#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)
$
Пожалуйста, помогите определить, что я делаю неправильно.
Хорошо, сэр. Вы просите 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]);
argc > 1
перед размещением, копированием.argv[1]
?strlen(NULL)
приведет к UB и segfault. Смотрите это