Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
18 / 18 / 9
Регистрация: 09.07.2015
Сообщений: 91
Записей в блоге: 2
1

Не выходит из цикла после символа новой строки

28.11.2017, 22:17. Показов 540. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Одна из первых задач Кернигана и Ричи, но и с ней справиться не могу
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
 
/*Программа, копирующая символы ввода в выходной поток, и заменяющая стоящие подряд пробелы на один - C (СИ)*/
 
int main()
{
    char ch;
    int n = 0;
 
    while((ch = getchar()) != '\n')
    {
        if(ch == ' ')
        {
            while((ch = getchar()) == ' ');
            putchar(' ');
        }
 
        if(ch != ' ')
            putchar(' ');
 
        printf("^%d^", ch);
    }
 
    return 0;
}
По большому счету программа работает, но если в конце строки оставить пробел, то из цикла не выйдет.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.11.2017, 22:17
Ответы с готовыми решениями:

Почему массив выходит с новой строки?
using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

Программа выходит из цикла после первой итерации
Здравствуйте. У меня проблемка суть задачи в целом в том, что бы перенести из одного листа на...

Цикл должен прекращаться после пробела, но программа не реагирует и не выходит из цикла
#include &lt;stdio.h&gt; int main() { char num; FILE *file; if ((file = fopen(&quot;1.txt&quot;, &quot;w&quot;)) ==...

Избавление от цикла копирования символа строки
Пишу сюда еще раз. По той же самой программе. Ненавижу своего преподавателя. У меня и у него...

3
174 / 134 / 105
Регистрация: 14.04.2016
Сообщений: 719
28.11.2017, 23:02 2
skales007, у вас будут все буквы через пробел идти? Нет?

C
1
2
if(ch != ' ')
putchar(' ');
Добавлено через 6 минут
skales007, сам читаю эту же книгу.
В общем моя версия происходящего. При первом вызове gecthar в поток передаётся ваша строка. Она где-то сохраняется, а вот первый символ возвращается в переменную ch. Во втором вашем цикле содержимое потока считывается до конца, программа возвращается во внешний цикл и определяет, что строка ввода пуста и требует повторить ввод с начала.
Это лишь моё предположение. Знающие люди, поправьте.

Добавлено через 3 минуты
skales007,
Код с выходом
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
 
/*Программа, копирующая символы ввода в выходной поток, и заменяющая стоящие подряд пробелы на один - C (СИ)*/
 
int main()
{
    char ch;
    int n = 0;
 
    while ((ch = getchar()) != '\n' && n == 0)
    {
        n++;
        if (ch == ' ')
        {
            while ((ch = getchar()) == ' ');
            putchar(' ');
        }
 
        if (ch != ' ')
            putchar(' ');
 
        printf("^%d^", ch);
    }
 
    return 0;
}
1
18 / 18 / 9
Регистрация: 09.07.2015
Сообщений: 91
Записей в блоге: 2
28.11.2017, 23:30  [ТС] 3
Прошу прощения)) Пока эксперименты ставил, такой непонятный код и запостил сюда. На самом деле вот он (разумеется не рабочий):
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
 
int main()
{
    char ch;
    int n = 0;
 
    while((ch = getchar()) != '\n')
    {
        if(ch == ' ')
        {
            while((ch = getchar()) == ' ');
            putchar(' ');
        }
 
        if(ch != ' ')
            putchar(ch);
 
    }
 
    return 0;
}
0
229 / 112 / 35
Регистрация: 25.11.2017
Сообщений: 389
29.11.2017, 01:09 4
Правильно. Потому что получив пробел на вход вы вызываете внутри еще один getch() который "съедает" введенный символ новой строки. Если вы в вашей программе после пробела в конце строки дважды нажмете ввод, то выйдет из цикла.

Вот так должно заработать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
 
int main()
{
    char ch;
    int n = 0;
 
    ch = getchar();
    while(ch  != '\n')
    {
        if(ch == ' ')
        {
            ch = getchar();
            if (n == 0)
              { putchar(' '); n = 1; }
            continue;
        }
        else { n = 0; putch(ch); ch = getchar(); }
 
    }
 
    return 0;
}
0
29.11.2017, 01:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.11.2017, 01:09
Помогаю со студенческими работами здесь

Из строки сформируйте новую, добавив заданный пользователем символ после каждого символа строки
Строки на Java!помогите в тупике Из заданной пользователем строки сформируйте новую, добавив...

Отсечь часть строки после вхождения символа/строки
string file = File.ReadAstring _file = File.ReadAllLines(_fileName); Такое вхождение...

Строки. Вставить после 3 символа в данной строке, подстроку «rama» и посчитать длину получившейся строки
Пользователем задана строка. Вставить после 3 символа в данной строке, подстроку «rama» и посчитать...

Замена символа "новой строки"
Здравствуйте. Пишу транслятор на Delphi, только начинаю делать программки. Столкнулся с...

Добавление новой строки в конец DataGridView после сортировки
Всем привет, такой вопрос - сделал в Гриде таблицу, добавляю записи как положено через источник...

Возврат идентификатора сразу после вставки новой строки
Проблема такая... Есть таблица: persona -------- id_persona (ключ) surname name...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru