2013-09-08 5 views
2

Я прочитал, что сохранение строки в массиве символов (с нулевым завершением) позволяет впоследствии манипулировать строкой (в отличие от указателя на строковый литерал).Манипулировать массив символов как строку в c

#include <stdio.h> 
int main() 
{ 
    char s[10]="Stack"; 
    s[9]='a'; // a gets stored in array and if index is less than 6 string gets changed 
    printf("%s\n",s);  
    return 0; 
} 

Выход: Stack

Это работает до тех пор, как индекс манипулировать меньше длины строки.

Это означает, что содержимое строки (и, следовательно, размер) не может быть изменено, даже если есть пустое пространство?

Есть ли какой-либо прямой способ (не используя функции), чтобы добавить 'a' в нужное положение?

+1

Можете ли вы объяснить больше, что вы хотите сделать? – pablo1977

+0

короткий ответ «нет» –

+1

Я понятия не имею, о чем вы спрашиваете. Знаете ли вы, что 0-терминатор делает все функции предполагаемыми, что в строке больше символов? –

ответ

6

printf будет печатать только символы из строки до NUL-терминатор. При установке s[9]='a'; содержимое s стать:

{'S', 't', 'a', 'c', 'k', '\0', '\0', '\0', '\0', 'a'} 

при печати s[9], это есть:

printf("%c", s[9]); 

Посмотрите std::string.

+0

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

+0

«Память может стать такой», есть ли другой способ? –

+0

используйте std :: string, если вы хотите добавить символы в строку – billz

3

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

for (i = 0; i < len_of_str; i++) 
{ 
    if (str[i] == '\0') 
     continue; 
    printf("%c", str[i]); 
} 
+0

yes thx таким образом я могу его прочитать. –

3

«Это означает, что содержимое строки (и, следовательно, размер) не может быть изменено, даже если есть пустое пространство?» Вы можете, конечно, изменить hte string conent (иначе говоря, отдельные символы), но вы не можете изменить размер хранилища (количество элементов, в данном случае количество символов) в массиве. Поскольку, как только вы определяете массив (в данном случае s), C выделяет для него столько места для хранения, и вы не можете делать какие-либо предположения о памяти за пределами выделенного пространства.

«Есть ли какой-либо прямой способ (не используя функции), чтобы добавить« a »в нужное положение?». Да, прямо назначьте его. Ограничение состоит в том, что вы не должны выходить за пределы пространства для хранения (исключая символ NUL). Например, вы можете легко сделать «s [2] = 'u';" и выход будет «Stuck» вместо «Stack».

+1

yes that is true, если у меня есть индекс <длина, только printf может ее прочитать. иначе нет. –

2

после «стека» установлено значение s [10], s [0] = 's', s [1] = [t] ... s [4] = 'k', s [5] = '\ 0'. В C и C++, когда массив символов печатается как строковый формат, длина строки равна индексу '\ 0', независимо от того, сколько памяти выделено для массива.

1

быстрый ответ «нет», вы не можете изменить размер массива символов просто делая

arr[size+1] = 'a'; 

как вы не можете изменить размер массива целых чисел таким же образом. , но вы можете использовать динамическую строку с char * и выделить память на malloc function

1

Я немного изменил код и отлично работает.

#include<stdio.h> 
    using namespace std; 
    int main() 
    { 
    char s[10]="Stack"; 
    s[8]='a'; // a gets stored in array and if index is less than 6 string gets changed 
    s[5]='n'; 
    s[9]='\0'; 
    printf("%s\n",s); 
    return 0; 
} 

Выход: stackn // «\ 0» символы не печатаются не печатаются Сначала вынимают нулевой символ «\ 0», присутствующую в с [5] положение и заменить с характером, так что вы можете вставьте символы в массив s

Во-вторых, s [10] означает 0-9, поэтому замените код s [9] = 'a' на s [8] = 'a', поскольку для печати строки, которую вы должны написать нулевой символ в s [9] = '\ n'.

+0

без использования пространство имен ... сбор ошибка. –

+0

@ user2653718: Ответ использует C++, а не C. – alk