#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;
}