Как скопировать char * str в char c [] в C? - PullRequest
9 голосов
/ 02 октября 2009

Попытка скопировать char *str в char c[], но получена ошибка сегментации или неверная ошибка инициализатора.

Почему этот код дает мне ошибку сегмента ?

char *token = "some random string";
char c[80];  
strcpy( c, token);
strncpy(c, token, sizeof c - 1); 
c[79] = '\0';
char *broken = strtok(c, "#");

Ответы [ 6 ]

17 голосов
/ 02 октября 2009

используйте strncpy() вместо strcpy()

/* code not tested */
#include <string.h>

int main(void) {
  char *src = "gkjsdh fkdshfkjsdhfksdjghf ewi7tr weigrfdhf gsdjfsd jfgsdjf gsdjfgwe";
  char dst[10]; /* not enough for all of src */

  strcpy(dst, src); /* BANG!!! */
  strncpy(dst, src, sizeof dst - 1); /* OK ... but `dst` needs to be NUL terminated */
      dst[9] = '\0';
  return 0;
}
2 голосов
/ 02 октября 2009
char *str = "Hello";
char c[6];
strcpy( c, str );
1 голос
/ 02 октября 2009

используйте strncpy, чтобы не копировать больше символов, чем может содержать символ []

char *s = "abcdef";
char c[6];

strncpy(c, s, sizeof(c)-1);
// strncpy is not adding a \0 at the end of the string after copying it so you need to add it by yourself
c[sizeof(c)-1] = '\0';

Редактировать: Код добавлен в вопрос

При просмотре вашего кода ошибка сегментации может быть в строке

strcpy(c, token)

Проблема в том, что если длина токена больше, чем длина c, то память заполняется из c var и это вызывает проблемы.

0 голосов
/ 02 октября 2009

Прошло много времени с тех пор, как я написал код на c / c ++, но c [80], вероятно, размещен в стеке. Если вы используете char * c и strdup или similiar, вы получаете его в куче, где strtok может получить к нему доступ.

Попробуйте что-то вроде этого.

char *token = "some random string";
char *c;
c = strdup(token);
char *broken = strtok(c, "#");
free(c);
0 голосов
/ 02 октября 2009

Отредактировано: Спасибо за добавление кода.

Возможно, здесь произошла ошибка:

strncpy(c, token, sizeof c - 1); 

sizeof имеет тот же приоритет, что и '-' справа налево, поэтому он, вероятно, обрабатывается как:

strncpy(c, token, sizeof( c - 1 ) ); 

вместо

strncpy(c, token, sizeof(c) - 1); 

что, вероятно, то, что вы хотели

(ссылка: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence)

0 голосов
/ 02 октября 2009

char c [] должен иметь некоторый размер;

например

char c[]= "example init string";

// которые настраивают таблицу c для c [19]; Вы можете разместить его прямо в начале вашей программы;

char c[19] = {0}; // null filled table

char c [i] - указатель, поэтому вам не нужно ничего копировать; символ с [19]; c = "пример строки инициализации"; // теперь & c [0] указывает на тот же адрес;

Копирование может быть выполнено с

 strcpy(dst, src);

но MS заставляет вас использовать безопасную функцию:

strcpy_s(dst,buffsize,src);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...