2013-08-30 3 views
2

Почему это не работает?Объявление и инициализация строк

#include<stdio.h> 
int main() 
{ 
char ch[50]; 
ch[50]="manipulation"; 
puts(ch); 
} 

и почему это работает?

#include<stdio.h> 
int main() 
{ 
char ch[50]="manipulation"; 
puts(ch); 
} 

К «это работает» я имею в виду, я получаю выход я хочу, то есть печать «манипуляция» (без кавычек) в качестве стандартного вывода.

+0

читать [Разница между символами 'char * str' и' char str [] 'и как оба хранилища в памяти?] (Http://stackoverflow.com/questions/15177420/what-does-sizeofarray-return/15177499# 15177499) –

ответ

1

Это не работает, потому что с синтаксисом:

ch[50]="manipulation"; 

Вы назначая строку «манипулирование» на 50-й элемент гл. Это невозможно, потому что массив состоит из отдельных символов, и вы назначаете строку отдельному символу. Кроме того, ch имеет элементы от 0 до 49, и нет 50-го элемента.

Если что-то не в порядке с моим объяснением, пожалуйста, скажите мне. И извините за мой плохой английский.

+0

самый простой описание. – chanzerre

1
  1. ch[50] = "manipulation" недопустимый синтаксис. Ближе будет ch = "manipulation", но массивы не изменяются lvalues, поэтому вы не можете их назначать. Используйте strcpy(3), или объявить ch как указатель вместо:

    strcpy(ch, "manipulation"); 
    

    или

    char *ch; 
    ch = "manipulation"; 
    
  2. Ваш второй пример является инициализация, а не выражение присваивания. Эта форма создает массив ch и копирует предоставленный строковый литерал для его инициализации.

+0

Нет, в декларации это означает «инициализация». Он должен отличаться от выражения, чтобы вы могли использовать его в глобальной области действия или для инициализации объектов со статической продолжительностью хранения. –

1

Вы не можете назначать голые C-массивы, вот почему. Второй случай - это не назначение, а инициализация.

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

struct Char50 { char data[50]; }; 

struct Char50 x; 
struct Char50 y = { "abcde" }; 
x = y; 
puts(x.data); 

Более идиоматических способ обработки строк является strcpy, хотя, например, strcpy(ch, "abcde");, хотя вы должны быть осторожны с размером буфера назначения.

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