Я пытаюсь заменить несколько пробелов одним пробелом.
#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
петля.
Чтобы прочитать весь ввод от пользователя до конца ввода, пропуская пробелы, которые встречаются несколько раз подряд, используйте что-то вроде этого.
#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);
}
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
.)
Ваш цикл 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 может привести к истине, хотя вы еще не достигли конца файла.