2016-06-12 4 views
3

Я недавно начал писать код на C, и мне с ним очень весело. Но я столкнулся с небольшой проблемой, что я пробовал все решения, о которых я мог думать, но не имел успеха. Как назначить переменную char * для массива?Как присвоить char * переменной массива

Пример

int main() 
{ 
    char* sentence = "Hello World"; 

    //sentence gets altered... 

    char words[] = sentence; 

    //code logic here... 

    return 0; 
} 

Это, конечно, дает мне ошибку. Ответ очень ценится.

+1

вы можете объяснить, что вы имеете в виду под «предложение получает изменен» (с указанием кода будет хорошо) –

+1

Проверьте это [вопрос] (http://stackoverflow.com/questions/3172075/segmentation-fault-reversing-a -string-буквальный). Если по _sentence будет изменено, вы имеете в виду, что пытаетесь изменить строку, тогда у вас есть другая проблема с кодом. –

+0

@DmitryKuznetsov Спасибо, что указали это (каламбур непреднамеренно). Я просто понял, что я не могу изменить значение указателя. – Twahanz

ответ

1

Включите все предупреждения компилятора по адресу и доверьтесь тому, что он говорит. Инициализатор массива должен быть строковым литералом или списком инициализаторов. Как таковой он нуждается в явном размере или инициализаторе. Даже если вы явно инициализировали его, все равно не было бы назначено так, как вы писали.

words = sentence; 

Проконсультируйтесь с this SO post с цитатой из стандарта C.

По:

Как Назначить символ * в переменной массива?

Вы можете сделать это путем заполнения вашей «переменную массива» с содержанием строкового литерала указывает char *, но вы должны дать ему явную длину, прежде чем вы можете сделать это путем копирования. Не забудьте #include <string.h>

char* sentence = "Hello World"; 
char words[32];    //explicit length 
strcpy (words, sentence); 
printf ("%s\n", words); 

Или таким образом:

char* sentence = "Hello World"; 
char words[32]; 
size_t len = strlen(sentence) + 1; 
strncpy (words, sentence, (len < 32 ? len : 31)); 
if (len >= 32) words[31] = '\0'; 
printf ("%s\n", words); 

BTW, ваш main() должен вернуть int.

+0

BTW 'strncpy' было бы лучше предотвратить переполнение буфера –

+0

@EdHeal strncpy имеет свой собственный набор проблем, вы можете заменить переполнение буфера одного типа другим. ИМХО его почти никогда не использовать –

+0

Согласен! Это просто показать эту идею. – user3078414

0

Я думаю, что вы можете сделать это с strcpy:

#include <memory.h> 
#include <stdio.h> 
int main() 
{ 
    char* sentence = "Hello World"; 
    char words[12]; 
    //sentence gets altered... 
    strcpy(words, sentence); 
    //code logic here... 
    printf("%s", words); 
    return 0; 
} 

..ел я не понял. Вышеприведенный код скопирует строку в массив символов.

+0

'strncpy' будет лучше –

+0

" * '// предложение получает измененное ...' * ', изменяя, где точки 'предложения' будут ссылаться на неопределенное поведение, поскольку' предложение' находится в постоянной памяти. – alk

+0

Почему волшебство '12'? – alk

2
  1. Вы должны дать массиву words длину

    char words[100]; // For example 
    
  2. Использование strncpy для копирования содержимого

    strncpy(words, sentence, 100); 
    
  3. Только в случае, если добавить нулевой символ, если строка sentence слишком длинный

    words[99] = 0; 
    
0

Как назначить char * переменной Array?

Код, указанный ниже, может быть полезна для некоторых случаев, поскольку он не требует копирования строки или ее длины.

char* sentence0 = "Hello World"; 
char* sentence1 = "Hello Tom!"; 

char *words[10]; // char *words[10] array can hold char * pointers to 10 strings 

words[0] = sentence0; 
words[1] = sentence1; 

printf("sentence0= %s\n",words[0]); 
printf("sentence1= %s\n",words[1]); 

Выход

sentence0= Hello World 
sentence1= Hello Tom! 
-1

Я предполагаю, что вы хотите сделать следующее:

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
char* sentence = "Hello World"; 

//sentence gets altered... 

char *words = sentence; 
printf("%s",words); 

//code logic here... 

return 0; 

}

+0

1. Не нужно бросать 'malloc()'; 2. Код пропускает выделение пространства для '0'-terminator; 3. 'words = sentence;' утечка памяти, выделенной в строке раньше. – alk

+1

Вопрос был о «* как заполнить массив *». В коде, который вы показываете, нет массива. – alk

+0

@alk Спасибо за указание. Я отредактировал, хорошо ли сейчас? –

0

Заявлении

char* sentence = "Hello World"; 

Устанавливает указатель sentence для указания на постоянное запоминающее устройство, где сохраняется последовательность символов «Hello World \ 0».

words - это массив, а не указатель, вы не можете сделать массив «точкой» где угодно, поскольку это фиксированный адрес в памяти, вы можете копировать его только из него и из него.

char words[] = sentence; // error 

вместо объявить массив с размером затем скопировать содержимое того, что sentence указывает на

char* sentence = "Hello World"; 
char words[32]; 
strcpy_s(words, sizeof(word), sentence); // C11 or use strcpy/strncpy instead 

Строка теперь дублируются, sentence все еще указывает на исходное «Hello World \ 0» и массив words содержит копию этой строки. Содержимое массива может быть изменено.

+0

Почему волшебство '32'? – alk

+0

@alk просто произвольное значение, чтобы содержать «Hello World», звучало так, будто он хотел его изменить, поэтому добавил еще несколько байтов. –

0

Среди других ответов я попытаюсь объяснить логику массивов без определенного размера. Они были введены только для удобства (если компилятор может вычислить количество элементов - он может это сделать для вас). Создание массива без размера невозможно.

В вашем примере вы пытаетесь использовать указатель (char *) в качестве инициализатора массива. Это невозможно, потому что компилятор не знает, сколько элементов осталось за вашим указателем и действительно может инициализировать массив.

Стандартное заявление за логикой:

6.7.8 Инициализация

...

22 Если массив неизвестного размера инициализирован, его размер определяется по самым крупным индексированный элемент с явным инициализатором. На конце списка инициализатора массив больше не имеет неполного типа.

Смежные вопросы