Строки в c программировании - PullRequest
4 голосов
/ 21 октября 2011

почему я не могу скомпилировать программу, содержащую код

char name[10];
name= "Rajesh";

Хотя я могу скомпилировать программу с

char name[10]="Rajesh";

Ответы [ 6 ]

9 голосов
/ 21 октября 2011

Это потому, что ваш фрагмент кода не выполняет объявление , но присваивание :

char name[10];  // Declaration 

name= "Rajesh"; // Assignment.

И массивы не могут быть напрямую назначены в C.

Имя name фактически разрешается по адресу его первого элемента (&name[0]), который не является lvalue , и поэтому не может быть целью назначения.

Объявления и назначения строковых переменных

Строковые переменные могут быть объявлены так же, как и другие массивы:

char phrase[14];

Строковые массивы могут быть инициализированы или частично инициализированы одновременно с объявлением, используя список значений, заключенный в фигурные скобки "{}" (то же самое верно для массивов других типов данных).Например, оператор

char phrase[14] = {'E','n','t','e','r',' ','a','g','e',':',' ','\0'};

объявляет массив «фразу» и инициализирует его в состояние.Заявление

char phrase[14] = "Enter age: ";

эквивалентно.Если пропустить «14», массив будет создан достаточно большим, чтобы содержать как значение «Enter age:», так и символ стража «\ 0», так что два оператора

char phrase[] = {'E','n','t','e','r',' ','a','g','e',':',' ','\0'};
char phrase[] = "Enter age: ";

эквивалентны как друг другу, так и выражению

char phrase[12] = "Enter age: ";

Однако важно помнить, что строковые переменные являются массивами,поэтому мы не можем просто делать присваивания и сравнения, используя операторы "=" и "==".Мы не можем, например, просто написать

phrase = "You typed: "; //Wrong way

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

Отредактировано:

И другой способ сделать это, используя указатель: -

Объявить переменную

char const *phrase;     /* a pointer to type character */

И инициализируйте переменную так, как вам нужно, как

phrase = "Test string"; 
5 голосов
/ 21 октября 2011

Вы не можете присваивать значения строковым массивам с помощью присваивания.
В C вы можете только инициализировать массивы, не назначая их, массив символов не является исключением для этого правила.

Вам нужно будет использовать функции копирования строк, такие как strcpy или strncpy и т. Д.

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

typedef struct Yourstring Yourstring; 
struct Yourstring 
{ 
    char a[24]; 
};  
Yourstring a = { "abcd" }; 
Yourstring b = a; 
Yourstring c = { 0 }; 
c = b; 
3 голосов
/ 21 октября 2011
char name[10];

В этом первом примере вы объявляете name массивом из десяти символов.Символ name теперь интерпретируется как начальный адрес этого массива, но хотя вы можете записать в массив, вы не можете переместить символ name.Итак, это:

name= "Rajesh";

будет означать наведение name от объявленного вами массива и на расположение строкового литерала "Rajesh", который хранится в другом месте в памяти.Вы просто не можете этого сделать.

То, что вы можете сделать, это либо:

strcpy(name, "Rajesh");

, который копирует ваш строковый литерал из неизменяемого места в вашем исполняемом файле вмассив char, который вы объявили, или:

char const *pointer_to_name = "Rajesh";

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

char name[10]="Rajesh";

, который объявляет name массивом из 10 символов и инициализирует его .

0 голосов
/ 21 октября 2011

Я не помню, где именно я это читал, но стандарт C говорит, что вы можете назначить строковое значение для массива при определении, но не после определения.

char a[10]="rajesh" its a defination hence works
char a[10];a="rajesh"; fails its not a defination

скорее, вам нужно использовать strcpy (a, "rajesh") для присвоения значения для строки, если это не определение

0 голосов
/ 21 октября 2011
char name[10] ="Rajesh";

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

char name[10] = { 'R', 'a', 'j', 'e', 's', 'h', '\0' };

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

0 голосов
/ 21 октября 2011

AS char name[10]="Rajesh" - это определение, которое компилятор понимает, что вы пытаетесь сделать, и исправляет вашу ошибку.В c ++ строки, написанные в "", являются константными, и некоторые компиляторы помещают их в пулы строк для экономии места.name="...." означает, что вы пытаетесь присвоить константу непостоянному указателю, что недопустимо.

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

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