2016-09-13 3 views
-2

Я практикую С помощью следующего кода:заявления из цикла в то время как не работает

char* streverse(char* s){ 
    int len=strlen(s); 
    int i=0; int j=len; 
    char* r; 

    while(i<j){ 
     s[i]=s[j]; 
     i++; j--; 
    } 
    printf("\nReverse string is %s",s); 
    return r; 
} 

Но Printf никогда не выполняет. Если я удалю:

s[i]=s[j]; 

printf выполняет. Это странно, потому что в то время как цикл все равно не зависит от вышеприведенного назначения. Любые подсказки, почему printf не выполняется с указанным выше присваиванием?

EDIT:

При коррекции PRINTF подписи теперь печатает.

+2

Неопределенное поведение. –

+4

Вы знаете, что 's [strlen (s)]' всегда является терминатором? Итак, угадайте, что происходит в самой первой итерации цикла ... –

+2

Кроме того, запись в 'stdout' (что и делает' printf') сбрасывает буфер (т. Е. На самом деле делает запись) в новой строке. Поэтому печать единственной строки * first * в вызове 'printf' не имеет смысла. –

ответ

5

Вы должны установить j в len-1 в качестве первого изменения, так как в противном случае вы получите доступ к s за его пределами. Точнее, s[len] будет NUL (или символом \0), так как это то, как строки хранятся в C. И он будет заменен первым элементом s, что фактически делает его нулевой длиной/пустой строка.

Во-вторых, формат должен быть просто printf("\nReverse string is %s", s);

Кроме того, вы должны назначить r к чему-то, прежде чем вернуть его (к s наверное?), В противном случае он просто будет инициализирован к тарабарщина и вызвать проблемы на линии, когда вы пытаетесь использовать его как указатель.

+2

_'s [len] 'будет' NULL' _... на самом деле. 'NULL' не является« нулевым терминатором ». – LPs

+0

На самом деле 's [len]' не находится за пределами * выделенной * памяти. Выделяется также '' \ 0'', но не считается 'strlen()'. –

+0

Да, вы правы. Я внес изменения в ответ, чтобы отразить реальность –

3

Вы передаете %s в качестве спецификатора формата, который ожидает строковый аргумент, но передавая целочисленное значение i в качестве значения.

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