Запрос новичка: невозможно перевернуть массив символов в C

avatar
neo
3 августа 2015 в 17:41
123
1
0

Прежде всего: искренние извинения за то, что подняли такую ​​основную проблему, требующую внимания. Я намерен перевернуть массив символов с помощью строки ввода пользователя с помощью getchar () и отобразить его реверс с помощью putchar (). [Я понимаю, что могут быть более простые или более элегантные способы использования printf () и scanf (), но я очень хочу найти изъян в приведенной ниже логике с помощью getchar () и putchar ():]

#include <stdio.h>
#include <stdlib.h>
#define EOL '\n';

/* Reversing a character array */
int main()
{
int arr_char[10];
int i=0;

/* reading char elements into the array */
printf("Please input the array\n");

arr_char[0]= getchar();
while(arr_char[i]!= EOL && i<=9)
{
    i=i+1;
    arr_char[i]=getchar();

    printf("\ni=%d\n",i);
}
/* display reverse */
while(i>=0)
{
    putchar(arr_char[i]);
    i--;
}
return 0;
}

1) Я получаю сообщение об ошибке:

  reversing char array\main.c|15|error: expected ')' before ';' token|
  ||=== Build finished: 1 errors, 0 warnings (0 minutes, 0 seconds) ===|

К вашему сведению: строка 15 - это

while(arr_char[i]!= EOL && i<=9)

2) Я также пытаюсь распечатать счетчик «i», чтобы узнать, увеличивается ли он при нажатии «Enter» после ввода символа, и кажется, что это так.

3) Я определил массив arr_char как

int arr_char[10];

с намерением, что если кто-то вводит «-1» как EOF / EOL, тогда массив символов, возможно, не будет очень полезен. Я прав?

Я буду очень признателен за любые объяснения, которые помогут мне снова сориентироваться. Спасибо!

Источник
too honest for this site
3 августа 2015 в 17:45
3

Прочтите о синтаксисе таких директив препроцессора, как #define, и о том, как они работают. Подсказка: они не , а не требуют точки с запятой для завершения текста замены.

neo
3 августа 2015 в 17:52
0

Спасибо! Глупый я, упустил точку с запятой. Однако как записать запись типа «-1» или любую запись типа «Ctl-D» для обозначения конца поля?

too honest for this site
3 августа 2015 в 17:59
0

Этот вопрос говорит о том, что вам действительно стоит прочитать хорошую книгу C. Вы выбираете EOF (не обязательно -1!). ctrl-D - это ключ Unix для закрытия stdin на самом деле. Обратите внимание, что это не «конец поля», а «конец файла»! Любой разделитель полей зависит от приложения (например, новая строка является типичным примером для текста)

chux - Reinstate Monica
3 августа 2015 в 18:01
1

@neo "для захвата" -1 "или любого" Ctl-D "" "-> Что-то вроде printf("Please input the array\n"); int ch; while (i < sizeof arr_char && (ch = getchar()) != EOL && ch != EOF) { arr_char[i++]=ch; } while(i>0) { putchar(arr_char[--i]); };

Ответы (1)

avatar
interjay
3 августа 2015 в 17:46
3

Удалите ; с конца #define. Макросы выполняются с использованием подстановки текста, поэтому с точкой с запятой

while(arr_char[i]!= EOL && i<=9)

станет:

while(arr_char[i]!= '\n'; && i<=9)

что неверно.

У вас также есть дополнительная проблема в том, что ваш код может писать в arr_char[10], который находится за концом массива. Вам необходимо увеличить размер массива или изменить i<=9 на i<9.