c удалить новую строку char - PullRequest
1 голос
/ 14 декабря 2010

Я довольно новичок, чтобы сожалеть, если это глупый вопрос!

У меня есть это:

  fgets(question,200,stdin);
  char *memq = malloc(sizeof(strlen(question)));
  memq= question;

однако переменная вопроса всегда имеет новую строку в конце! как мне это убрать / предотвратить?

я пробовал это:

  fgets(question,200,stdin);
  char *memq = malloc(sizeof(strlen(question))-sizeof(char));
  memq= question;

не было никакого эффекта!

Ответы [ 5 ]

5 голосов
/ 14 декабря 2010

чтобы избавиться от новой строки, перед вашим malloc, выполните:

question[strlen(question)-1] = 0;

альтернатива (предложенная в комментариях ниже) будет делать следующее:

question[strcspn(question, "\n")] = '\0';

изменить строку malloc на:

char *memq = malloc(strlen(question)+1);

изменить строку назначения:

memq = question;

до:

strcpy (memq, question);
2 голосов
/ 14 декабря 2010

Этот код сильно сломан.

Вам нужно выделить strlen+1 байтов в memq, если вы планируете скопировать туда данные (почему вы делаете sizeof?, Что выделит 4 байта, поскольку sizeof(strlen()) равно sizeof(int)).

Вы не можете просто назначить question для memq и ожидать, что данные будут скопированы. Все, что вам нужно, это перезаписать указатель, который вы только что malloc -ed в memq, пропустить.Вы должны сделать

strcpy(memq, question);

Вот почему вам нужен дополнительный байт в memq, поскольку он включает нулевой терминатор.В этот момент вы можете удалить символ новой строки из memq, как указано в другом месте.

1 голос
/ 14 декабря 2010

В обоих случаях memq = question - это неправильно . Вы только что потеряли указатель на новое вновь выделенное пространство и вместо этого скопировали адрес первого символа question в memq

Используйте strcpy или memcpy вместо этого, чтобы скопировать содержимое строки, на которую указывает question, в содержимое памяти, на которое указывает memq.

1 голос
/ 14 декабря 2010

Скажем, ваш ввод ABCDEn, где n представляет новую строку.

Вы будете читать в ABCDEn0, где 0 представляет ноль, что завершает строку.

Итак,снимая последний символ, вы удаляете ноль, а не перевод строки.Я бы снял последний символ, как вы, но затем установил (новый) последний символ в null, чтобы завершить вашу строку.

0 голосов
/ 14 декабря 2010

Подсказка: удалите последний символ!(Подсказка к подсказке: вы знаете длину)

...