Хранение символа в указателе символа - PullRequest
0 голосов
/ 30 июля 2010

У меня есть глобальная переменная, которая *char.Заголовок моей основной функции читается как int main(int argc, char* argv[argc]){...}.Эти две строки кода должны оставаться такими, какие они есть.Первый аргумент моей основной функции - это число типа *char, которое я конвертирую в символ, используя atoi(...);.Я в основном меняю значение ASCII на соответствующий ему символ.Теперь я хочу сохранить этот локальный символ переменной в глобальной переменной, которая является указателем на символ.Я знаю, что проблема связана с распределением памяти, но я не уверен, как это сделать.

Мой код:

char* delim;
int main(int argc, char* argv[argc])
{
  char delimCharacter;
  if (isdigit(*(argv[3])) == 0) delim = argv[3]; //you can pass in a character or its ascii value
  else {   //if the argument is a number, then the ascii value is taken
    delimCharacter = atoi((argv[3]));
    printf("%s\t,%c,\n", argv[3], delimCharacter);
    //sprintf( delim, "%c", delimCharacter );  // a failed attempt to do this
    *delim = delimCharacter;
    //strncpy(delim, delimCharacter, 1);                // another failed attempt to do this
  }
  //printf("%s\n",delim);

Это приводит к ошибке сегмента.

Ответы [ 4 ]

1 голос
/ 30 июля 2010

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

if (argc < 4)
{
    printf("Need 3 args");
    exit(1);
}

Затем вам нужно выделить немного памяти для ввода символа.

delim = malloc(2);
// TODO: Should check the result of malloc before using it.
*delim = delimCharacter;
delim[1] = 0; // Need to NULL terminate char*
0 голосов
/ 30 июля 2010

В дополнение к вашей проблеме с памятью, я думаю, вы не понимаете, что делает atoi.Он анализирует строковое представление числа и возвращает эквивалентное значение типа int, например, «10000» => 10000.Я думаю, что вы думаете, что это даст вам значение ASCII символа, например, "A" => 65.

Так как у вас есть char *, и вы (я думаю) предполагаете, что он содержитодиночный символ, вы могли бы просто сделать это:

delimCharacter = *(argv[3]);

Однако, похоже, нет необходимости использовать промежуточный шаг для присвоения этого значения переменной char.Если конечная цель состоит в том, чтобы delim указывал на символ, который является разделителем, то, похоже, это все, что вам нужно сделать:

delim = argv[3];

Это не только удаляет ненужный код, но и означает, чтовам больше не нужно было бы выделять дополнительную память для указания delim.

Я бы также объявил delim как const char *, так как я предполагаю, что нет причин для его изменения.

0 голосов
/ 30 июля 2010
char delim[] = ","; // anything really, as long as as it's one character string

...


delim[0] = delimCharacter;
0 голосов
/ 30 июля 2010

Вы разыменовываете неинициализированный указатель. delim никогда не инициализируется при переходе в блок else.

...