Ну, первое, что я замечаю, при компиляции и выполнения этого является , что он не позволяет ввести строку. Это связано с тем, как вы принимая вход:
printf("enter the size of the string ");
scanf("%d",&n);
printf("enter the string ");
fgets(a,n,stdin);
Он работает scanf("%d",&n);
. Таким образом, пользователь вводит, скажем, 6
, а затем вводит ключ . Hokay, так scanf
смотрит на этих персонажей 6\n
, принимает 6
, преобразуется в число, и n
заканчивается значением 6.
Но это символ новой строки по-прежнему существует. scanf
ничего не сделал с этим т.к. не число. Итак, когда код добирается сюда:
fgets(a,n,stdin);
Затем он читает эту новость и думает: «Ладно! Пользователь ввел пустую строку . »(Да, я знаю, что я антропоморфен, подал в суд на меня.)
Такое поведение объясняется тем, что я избегаю использования scanf
. Я бы закодировать это таким образом:
fgets(a, sizeof(a), stdin);
n = atoi(a);
printf("enter the string ");
fgets(a, sizeof(a), stdin);
Обратите внимание, что это также ограничивает каждый fgets
до размера буфера, избежать потенциального переполнения буфера. Это важное соображение с рабочим кодом, поскольку переполнение буфера может легко привести к уязвимости , которая может быть использована для нарушения безопасности. Лучше всего развивать хорошие привычки даже с помощью простых обучающих программ, подобных этому. Обратите внимание, что лучшим способом сделать это было бы просто прочитать строку , а затем вычислить ее длину с помощью strlen
.
На данный момент он работает правильно, поэтому я не буду вдаваться в остальную часть. Однако, если вы примете мой совет о вычислении длины , есть еще одна вещь, о которой нужно знать. Если добавить эту строку (временно, только для целей отладки):
printf("%d\n", strlen(a));
Вы увидите, что у вас есть еще один персонаж, чем вы ожидаете. То есть , потому что fgets
сохраняет новую строку. Таким образом, мы хотим, чтобы избавиться от него:
a[strlen(a) - 1] = '\0';
Это не является необходимым, если вы используете значение n
, потому что тогда это будет просто игнорировать символ новой строки и использовать n
символы предшествующих. Но это необходимо, если вы вычисляете длину.
Возможный дубликат [палиндром программы в C] (http://stackoverflow.com/questions/34784096/palindrome-program-in-c) –
Это более полезно, чтобы указать, что * * ошибки во время выполнения вы получите .. , –