Реверсирование строки без библиотечной функции

#c #string #reverse #swap #reversing

Вопрос:

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

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

int main() {      
    int temp, i, j, length;
    char name[20], name1[20];

    printf(" Enter string n");
    scanf("%s", name);
    length = strlen(name);
    printf(" %d", length);
    for (i = length - 1; i >= 0; i--) {
        name1[length - i] = name[i];
    }
    printf("%S ", name1);
    
    return 0;
}
 

Комментарии:

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

Ответ №1:

Используйте строчные буквы » s » при печати:

 printf("%s ",name1);

 

Аналогичные коды: https://www.programmingsimplified.com/c-program-reverse-string

Ответ №2:

Проблемы, которые я заметил:

  • length-i будет отключено на 1 здесь:
     name1[length-i]=name[i];
     
  • Вы забыли добавить нулевой терминатор ( ).
  • %S это нестандартный printf форматер. Ты, наверное, хочешь %s .

Предлагаемые изменения:

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

int main() {
    char name[20], name1[20];

    printf(" Enter string n");

    if(scanf("s", name) != 1) {         /* check that input works */
        fprintf(stderr, "input failuren");
        return 1;
    }

    int length = strlen(name);

    printf(" %dn", length);

    for(int i = 0; i < length;   i) {
        name1[length - i - 1] = name[i];  /* corrected indexing */
    }

    name1[length] = '';                 /* add null terminator */

    printf("%sn", name1);                /* %s instead of %S */
}
 

Ответ №3:

Вот некоторые проблемы в вашем коде:

  • вы должны ограничить количество символов, хранящихся в name с s .
  • name1[length - i] = name[i]; не использует правильное смещение. Попробуйте первую итерацию: i length-1 вы копируете последний символ в позицию length - (length - 1) , следовательно 1 , вместо позиции 0 . Используйте это вместо:
       name1[length - i - 1] = name[i];
     
  • вы должны установить нулевой терминатор в конце перевернутой строки:
       name1[length] = '';
     
  • в printf() вызове %S неверно. Используйте %s вместо этого и добавьте новую строку.

Вот измененная версия:

 #include <stdio.h>

int main() {      
    char name[20], name1[20];
    int i, length;

    printf(" Enter string:n");
    if (scanf("s", name) == 1) {
        length = strlen(name);
        printf("%dn", length);
        for (i = 0; i < length; i  ) {
            name1[length - i - 1] = name[i];
        }
        name1[length] = '';
        printf("%sn", name1);
    }
    return 0;
}
 

Комментарии:

1. можете ли вы объяснить, как работает эта строка кода, если (scanf(«s», имя) == 1)

2. scanf преобразование %s сохраняет слово в массив, на который указывает следующий аргумент. s ограничивает это преобразование максимум 19 символами плюс нулевым терминатором, что гарантирует отсутствие переполнения буфера, как name в массиве из 10 байт. scanf() возвращает количество успешных конверсий: так и должно быть 1 . scanf() вернется EOF , если ни одно слово не может быть преобразовано, потому что поток находится в конце файла. Тестирование scanf("s", name) == 1 гарантирует, что остальная часть кода выполняется только в том случае, если она не находится в конце файла.

Ответ №4:

Вы можете попробовать вот это:-

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    int i, length;
    char name[20], temp;
    printf(" Enter string n");
    scanf("%s", name);
    length = strlen(name);
    printf(" %d", length);
    for(i = 0; i < length /2; i  )
    {
        temp = name[i];
        name[i] = name[length-i-1];
        name[length-i-1] = temp;
    }
    printf("n%s", name);
    return 0;
}