Указатель, Строковая проблема в C - PullRequest
1 голос
/ 23 января 2010

Я впервые использую C для проекта класса после первого изучения C ++, поэтому синтаксис меня убивает ... По сути, мне нужно сохранить строку, заданную функцией, в отдельной переменной для дальнейшего использования.

У меня есть массив символов, объявленных как это

char foo[];

Функция, которую мне дали, назначает группу символов в этот массив (или указатели на символы?). Я могу распечатать фактическую строку, хранящуюся в Foo, как это

printf("%s", foo);

И я могу сохранить его адрес в другой переменной, как эта

char *bar;

bar = &foo[0];

printf("%s", foo);

Полная строка выводится просто отлично в обоих случаях. Тем не менее, как я могу сохранить эту строку в другой переменной? Если foo изменится, то bar больше не будет содержать нужную мне строку, так как она просто указывает на foo. Все, о чем я думал, дает мне ошибки компилятора, такие как

warning: initialization makes pointer from integer without a cast

Надеюсь, этого достаточно. Заранее спасибо за помощь.

Ответы [ 3 ]

6 голосов
/ 23 января 2010

Вам необходимо скопировать строку.

Самый простой способ - с выделением кучи:

char *bar = strdup(foo);

Не забудьте освободить это распределение, когда закончите с ним:

free(bar);

Если вы не хотите использовать выделение кучи, вы можете создать буфер в стеке и вручную скопировать его в него. Вы должны быть осторожны, чтобы не переполнить буфер (и чтобы ваш буфер заканчивался 0 strncpy не сделает этого за вас, если ваш src длиннее вашего dest):

char copy[SOMESIZE];
strncpy(copy, foo, sizeof(copy) - 1);
copy[sizeof(copy) - 1] = '\0';    

Если у вас есть поддержка массива переменной длины, вы можете использовать это:

char copy[strlen(foo) + 1];
strcpy(copy, foo);

Как правильно заметил в комментариях Кристоф , strdup не является частью стандарта C. Если вы используете Windows, вам нужно использовать _strdup . Если вы хотите быть абсолютно переносимым, вы можете легко реализовать strdup:

char *strdup(const char *orig)
{
    char *copy = (char *)malloc(strlen(orig) + 1);
    if (copy != NULL)
        strcpy(copy, orig);

    return copy;
}
0 голосов
/ 23 января 2010

Вам необходимо скопировать строку с помощью strncpy или продублировать ее с помощью strdup:

char foo[] = "Hello World";
char* bar = strdup(foo);

foo[0] = 'B';
printf("%s", foo);
printf("%s", bar);

free(bar); // Don't forget to release the memory!

Печать:

Bello World
Hello World

Или, если у вас уже есть строка, в которую вы хотите скопировать:

char foo[] = "Hello World";
char bar[] = "Goodbye Cruel World";

strncpy(bar, foo, sizeof(bar)-1); 

foo[0] = 'B';
printf("%s", foo);
printf("%s", bar);

Также звонит:

Bello World
Hello World

Третий аргумент strncpy - это максимальное количество копируемых символов (для предотвращения переполнения). Обратите внимание, что оно на единицу меньше, чем длина буфера bar, так что bar может заканчиваться нулем. Также обратите внимание, что sizeof работает только здесь, потому что bar является локальным массивом. Он не работает на char*, в этом случае вам нужно знать размер извне, например ::

char foo[] = "Hello World";
size_t bar_len = 20;
char* bar = (char*)malloc(bar_len);

strncpy(bar, foo, bar_len-1); // CANNOT use sizeof(bar) here!

foo[0] = 'B';
printf("%s", foo);
printf("%s", bar);

free(bar); // Don't forget!
0 голосов
/ 23 января 2010

используйте функцию strcpy для копирования строки в другую переменную.

char *myStringVar;

strcpy(myStringVar, your_Function_Returning_String() )

Выделите память для myStringVar, если возвращаемая строка находится вне области действия.

EDIT:

char *myStringVar = (char *)malloc(BUFFER_SIZE);
...