2015-07-03 2 views
0

Я пытаюсь добавить символ 't' в массив символов, имеющий значение «hello», я определяю размер массива, создавая новый массив, который равен 1 символ больше, назначая новый символ и '\ 0' в качестве последних двух символов. Я продолжаю печатать старую ценность (привет). спасибопытается добавить символ в массив символов

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

void append(char * string,char ch) 
{ 
    int size; 
    for (size=0;size<255;size++) 
    { 
    if (string[size]=='\0') 
     break; 
    } 
    char temp[size+2]; 
    strcpy(temp,string); 
    temp[size+1]='t'; 
    temp[size+2]='\0'; 
    printf("the test string is: %s\n",temp); 
} 

int main() 
{ 
    char test[]="hello"; 
    append(&test,'t'); 
    return 0; 
} 
+2

Вы бы лучше использовать 'strnlen()' - или 'strlen()' - чем выписываете цикл longhand так же, как и вы. –

+0

Индексирование массивов в C основано на '0'. – alk

ответ

1

Во-первых, ваш вызов функции неправильный. Он должен быть

append(test,'t'); // When an argument to a function, array decay to pointer to its first element. 

Затем, вы должны удалить '\0' из предыдущей строки, в противном случае вы получите ту же строку. Его, потому что после добавления символа ch, новая строка будет выглядеть

"hello\0t\0" 

Обратите внимание на '\0' до t. printf остановится на этом нулевом символе.

Вы можете перезаписать этот '\0' характер с характером 't', как

temp[size] = ch; 
temp[size+1] = '\0';  

Примечание: Ваша программа вызывает неопределенное поведение из-за отказа от связанного доступа массива temp в заявлении

temp[size+2]='\0'; 
+0

отлично работает, и я понимаю, почему это произошло. спасибо –

+2

Когда пустая строка передается 'size' из функции OP, будет' 0', так как она является индексом терминатора, поэтому параметр 'temp [size-1] = ch;' неверен (хотя я upvoted). –

+0

Не дубликат, но связанный с этим: http://stackoverflow.com/q/18891226/694576 – alk

0

Вы находите, но не перезаписываете первый нулевой символ.

1

Поскольку цикл прерывается всякий раз, когда string[size]=='\0', то строка будет скопирована в temp, temp[size] и \0, и она никогда не будет перезаписана, поскольку следующий присвоенный символ равен size+1. Таким образом, ваш временной интервал всегда заканчивается на size. В конце temp является "hello\0t\0"

+0

спасибо, всегда хорошо знать, где я ошибся –

2

Действительная функция может выглядеть следующим образом

void append(const char *string, char ch) 
{ 
    size_t size = 0; 

    while (string[size]) ++size; 

    char temp[size+2]; 

    strcpy(temp, string); 

    temp[size++] = ch; 
    temp[size++] ='\0'; 

    printf("the test string is: %s\n", temp); 
} 

И он должен быть назван как

append(test, 't'); 
+0

@ Adel Ahmed Только мой ответ правильный и полный. :) –

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