2016-06-29 3 views
2

Мне пришлось создать простую программу для изменения строки. В конце концов я получил этот код из своего собственного понимания, но также помог от google, так как я не мог изначально заставить его работать. Он работает нормально и выводит как следует, и я все понимаю, кроме заявления reverse[j] = '\0'. Я продолжал получать символы в своем выпуске, когда я не говорил об этом, но хочу знать, как это работает. Может ли кто-нибудь объяснить, пожалуйста?Что такое нулевой символ в программе обратной строки?

#include<stdio.h> 

int main(void) 
{ 
    char original[20], reverse[20]; 
    int length, i, j; 

    printf("Enter a string:\n"); 
    gets(original); 

    length = strlen(original); 

    for (i = length - 1, j= 0; i >= 0; i--, j++) 
     reverse[j] = original[i]; 

    reverse[j] = '\0'; //I don't know what this statement does exactly 

    printf("The string reversed is:\n %s\n", reverse); 

    return 0; 
} 
+2

Начните с чтения главы о струнах в вашей книге программирования C. – Lundin

+0

У меня есть, но я хотел простое объяснение. Мой учебник не очень хорошо объясняет. –

+6

Затем получите новую книгу. Любая книга на начальном уровне, которая не упоминает nul прекращения строк C, является плохим. – Lundin

ответ

8

Если вы хотите, чтобы массив символов содержал строку, то он должен иметь завершающий нуль.

Например, функция strlen, которая используется в вашей программе, подсчитывает символы в массиве символов до нулевого окончания.

Также функция printf, используемая с спецификатором формата %s, выводит символы из массива символов до тех пор, пока не будет встречен нулевой нуль.

Например, если у вас есть массив как этот

char s[10] = "Hello"; 

тогда вызов strlen(s) возвращается 5 вместо 10. И Printf вызова ("% s \ п", з); выводит 6 символов (включая новый символ строки).

Рассмотрим эту показательной программы

#include <stdio.h> 

int main(void) 
{ 
    char s[10] = "Hello"; 

    printf("%d\n", printf("%s\n", s)); 

    return 0; 
} 

Его выход

Hello 
6 

Эта инициализация

char s[10] = "Hello"; 

полностью эквивалентна

char s[10] = { 'H', 'e', 'l', 'l', 'o', '\0', '\0', '\0', '\0', '\0'}; 

Если вам нужно изменить строку, хранящуюся в массиве, очевидно, что вам нужно отменить символы перед первым завершающим нулем. И если вы хотите скопировать строку в обратном порядке в другой массив символов, вам нужно добавить массив назначения с нулевым завершающим.

Этот цикл

for (i = length - 1, j= 0; i >= 0; i--, j++) 
    reverse[j] = original[i]; 

копий в обратном порядке все символы, кроме завершающего нуля от исходного массива символов, начиная с последнего символа до завершающего нуля до массива символов назначения. Вам необходимо добавить массив символов назначения с нулевым нулевым номером

reverse[j] = '\0'; 
+1

Спасибо! Таким образом, в основном это маркировка конца строки, а не до конца размера массива? –

+1

@ nedst3r Да. Функция strlen, используемая в вашей программе, выполняет поиск нулевого нуля и подсчитывает количество символов до нулевого окончания. Например, если у вас есть массив char s [10] = "Hello"; то strlen вернет 5, хотя массив имеет 10 символов. –

+0

@ nedst3r Нет конца размера массива, если вы опускаете завершающий нуль и пытаетесь распечатать строку, он будет просто продолжать доступ к последовательной памяти до тех пор, пока не произойдет segfault. –

2

В C, строка всегда имеет \0 в конце. Прочтите why и how.

+1

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. - [Из обзора] (/ review/low-quality-posts/12849713) – Peter

+0

Согласен, будет держать это в виду впредь. – babon

2

\0 на самом деле не характер. Это программа , обозначающая конец строки. Поэтому, если вы хотите только изменить строку, вам не нужно перемещать этот символ в начале инвертированной строки.

original string: hello\0 
reverse string : olleh\0 
0

\ 0 для нулевого завершения строки.Это будет означать конец строки. Если оно не завершено нулем, данные в последующих местах также будут ошибочно рассматриваться как часть строки.

+1

"* Это будет помочь отметить * ", это не просто" * help * ", это" *** *** "знак. – alk

+0

Исправлено :). благодаря – Twinkle

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