Ошибка при копировании argv в массив char

0

Я пытаюсь скопировать 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]);
}

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

  • 1
    Какой параметр вы указали при запуске программы? Вы должны проверить argc > 1 перед размещением, копированием.
  • 2
    что такое argv[1] ? strlen(NULL) приведет к UB и segfault. Смотрите это
Показать ещё 2 комментария
Теги:

3 ответа

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
    некоторая дополнительная информация здесь
  • 0
    @ Сурав Гош Я не понял, почему ты отказался от моего ответа.
Показать ещё 3 комментария
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)
 $ 
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]);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню