2015-08-03 3 views
0

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

#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) ===| 

FYI: Строка 15 является

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

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

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

int arr_char[10]; 

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

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

+3

Ознакомьтесь с синтаксисом директив препроцессора типа '# define' и как они работают. Подсказка: они делают ** не ** требуют запятой, чтобы прервать заменяющий текст. – Olaf

+0

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

+0

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

ответ

3

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

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

станут:

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

что неправильно.

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