Борьба с функцией getchar () в C

Я пытаюсь заменить несколько пробелов одним пробелом.

#include <stdio.h>
#include <stdlib.h>
#define MAXLINE 500

main() {
char text[MAXLINE];
int i;

for(i = 0; (text[i] = getchar()) != EOF && text[i] != 'x'; i++) {
if(text[i] == ' ')
i++;

while((text[i] = getchar()) != EOF && text[i] != 'x' && text[i] == ' ');

if(text[i] == EOF || text[i] == 'x')
break;
}

text[i] = '\0';

printf("\n\n-- Result --\n%s", text);
}

я знаю это getchar() ожидает характер после enter был нажат, но я видел много раз, как люди используют его, чтобы получить целую строку до EOF найден. Даже в этом примере это работает, если я закомментирую while цикл (я получаю правильную строку, если я пишу одно слово без пробелов). То, что я хочу, это поместить каждый отдельный символ, который человек записывает в массив. Является getchar() функция хорошо использовать в этом случае? Если да, что мне нужно изменить в этом коде, чтобы он работал, потому что теперь он печатает только некоторые символы (если while цикл не закомментирован)? Как я уже сказал, это работает, если я напишу слово apple или аналогичные без каких-либо пробелов и без while петля.

-1

Решение

Чтобы прочитать весь ввод от пользователя до конца ввода, пропуская пробелы, которые встречаются несколько раз подряд, используйте что-то вроде этого.

#include <stdio.h>
#include <stdlib.h>
#define MAXLINE 500

int main() {
char text[MAXLINE];
int i;
int c;

c = getchar();
for (i = 0; c != EOF && i < MAXLINE-1; ++i) {
text[i] = c;

if ( c != ' ' ) {
c = getchar();
} else {
while ( c == ' ' )
c = getchar();
}
}
text[i] = '\0';

printf("\n\n-- Result --\n%s", text);
}
0

Другие решения

getchar возвращает intне char, так как он должен быть в состоянии
вернуть еще одно значение, которое может уместиться в char, это
ошибка программирования для присвоения результатов char, так как ты
потерять важную информацию. В зависимости от того, простой ли char
подписан или не подписан, проверка на EOF после назначения
это к символу будет означать, что вы никогда не сможете найти EOF (обычная
char без знака), или это определенный символ на входе (ÿ в
Латинская 1, как правило) будет рассматриваться как EOF,

В C ++ эквивалент std::cin.get(), но мы бы больше
вообще напиши что-то вроде

for ( int i = 0;
i < sizeof( text ) && std::cin.get( text[i]) && text[i] != 'x';
++ i ) {
//  ...
}

(Конечно, в C ++ мы, скорее всего, использовали бы std :: string, с
только один char или же int для ввода.)

В С (так как похоже, что это то, что вы на самом деле используете),
вам нужна дополнительная промежуточная переменная:

int ch;
for ( int i = 0;
i < sizeof(text) && (ch = getchar()) != EOF && ch != 'x';
++ i ) {
text[i] = ch;
//  ...
}

Обратите внимание, что на обоих языках вам нужно проверить границы как
первое условие. (В C ++ вам это не нужно, если вы используете
std::string.)

0

Ваш цикл while читает без приращения i, Таким образом, все прочитанные символы фактически отбрасываются, потому что они перезаписываются следующим циклом. Если вам нужно только заменить несколько пустых на одну пустую, вы можете сделать что-то подобное

char text[1024];
int  i;
int  c;

for(i = 0; i < sizeof(text)-1 && (c = getchar()) != EOF && c != 'x'; ) {
if( c != ' ' || i == 0 || text[i-1] != ' ' )
text[i++] = c;
}

Как уже заявлено в комментариях: напрямую не присваивать результат getchar() непосредственно к символу, иначе сравнение считанного байта с EOF может привести к истине, хотя вы еще не достигли конца файла.

0
По вопросам рекламы [email protected]