3 / 3 / 0
Регистрация: 07.10.2017
Сообщений: 18
1

Непонятные действия программы

07.10.2017, 12:40. Показов 898. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, не буду ходить вокруг да около, я начал изучать С (не С++) и мне нужна ваша помощь, надеюсь на ваше понимание.

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <stdio.h>
#include <stdlib.h>
 
#define MAXLINE 1000  //max size of line
 
int getline(char line[], int);
void copy(char to[], char from[]);
 
main()
{
    int len; //size of this line
    int max; // size of max line
    char line[MAXLINE]; //this line
    int j;
    for(j = 0; j < 1000; j++)
        line[j] = '\0';
 
    char longest[MAXLINE]; //max line
    max = 0;
    while((len = getline(line, MAXLINE)) > 0)
    if (len > max) {
        max = len;
        copy(longest, line);
    }
 
    if(max > 0)
        printf("%s", longest);
    return 0;
}
 
 
int getline(char s[], int size)
{
    int c,i;
 
    for(i = 0; i < size-1 && (c=getchar()) != 'a' && c != '\n'; ++i)
      s[i] = c;
      if(c == '\n'){
        s[i] = c;
        ++i;
      }
      s[i] = '\0';
      return i;
}
 
void copy(char to[], char from[])
{
    int i;
    i=0;
 
    while((to[i] = from[i]) != '\0')
        ++i;
}
При вводе следующих данных получаются такие результаты:
1) Ввожу [a] – Получаю [ничего я не получаю]
2) Ввожу [12345aa] – Получаю [12345]
3) Ввожу [123a456789aa] – Получаю [456789]
4) Ввожу [12345a] – Получаю бесконечный ввод (пока не введу отдельно букву «а»
(см. пункт 1) или пока не введу строку и на конце ДВЕ буквы «а» (см. пункт 2))
5) Ввожу
[1234]
[12345]
[12]
[123456a]
[123456789]
[a]
Получаю
[123456789]

У меня возник такой вопрос:
Почему при вводе [123a456789aa] моя (не совсем моя) программа завершается и выводит результат [456789]. Разве она не должна была отработать до [123], встретить букву «а», завершить цикл for (в функции getline) и перейти снова в цикл while (main). После чего из цикла while (main) снова перейти в цикл for (в функции getline) и ожидать нового ввода?
Буду очень признателен, если поможете.

p.s. Я человек начинающий, поэтому, если ответите развернуто – будет просто замечательно.
p.s.2 getline – здесь выступает не как конкретная функция (которая есть в С++), а просто как название функции
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.10.2017, 12:40
Ответы с готовыми решениями:

Непонятные действия win7 or HARDWARE
Вообщем история такая: ноуту где-то меньше года. Примерно раз в сутки, а чаще примерно в одно и то...

Установились непонятные программы
Всем привет. Скачал один файлик и тут началось. Программы не понятные ставятся, поисковик в хроме...

Nuesearh в браузерах и программы непонятные
Доброго времени суток! Подхватил какую-то заразу! Nuesearh в браузерах появляется, в процессах...

Непонятные программы, реклама в браузере
Были какие то левые программы типа GamesDisctop или что-то подобное. В браузере иногда по клику...

3
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
07.10.2017, 14:23 2
Лучший ответ Сообщение было отмечено non_grata как решение

Решение

Цитата Сообщение от non_grata Посмотреть сообщение
После чего из цикла while (main) снова перейти в цикл for (в функции getline) и ожидать нового ввода?
Функция getchar(), которая непосредственно осуществляет ввод данных внутри функции getline, будет ожидать новый ввод только в том случае, если во входном буфере нет новых символов (то есть если входной буфер пуст). А в вашем случае во входном буфере ещё остались символы 456789aa, которые будут тут же считаны, без дополнительного ожидания.
1
3576 / 2244 / 406
Регистрация: 09.09.2017
Сообщений: 9,396
07.10.2017, 14:31 3
Лучший ответ Сообщение было отмечено non_grata как решение

Решение

В getline() форматирование бы поправить.
Еще можно в конец getline() добавить отладочный вывод чтобы посмотреть что же вводится на самом деле, это не говоря о простейшем проходе по шагам
1
3 / 3 / 0
Регистрация: 07.10.2017
Сообщений: 18
07.10.2017, 15:26  [ТС] 4
Спасибо likehood, огромное, прям открыли мне глаза)

p.s. Я даже решил поэкспериментировать и сделал следующее:
Ввожу
[123a4567]
[12345aa]
Получаю [4567]

Пользователем, кого вдруг будет интересовать данный вопрос, разъясню, почему вывело именно [4567], а не вывело [12345], здесь же больше цифр, скажете вы. Но!!!! После ввода [123a4567] вы нажимаете на enter (а в условии сказано, что если символ равен enter, то длина строки будет увеличиваться на один)(НЕ ЗАБЫВАЙТЕ ПРО УСЛОВИЕ, ЧТО [123a] УЖЕ ОТРАБОТАЛО, СЕЙЧАС MAX = 3, НО БУФЕР У НАС В ДАННЫЙ МОМЕНТ НЕ ПУСТОЙ, ТАМ ЕСТЬ ЕЩЕ [4567+enter], СПАСИБО likehood). Да и к тому же в цикле while стоит строгое условие (if(len > max)), следовательно, когда мы введем [12345aa] у нас длина строки len будет равна max (5 = 5), а не больше ее, поэтому в условие if мы не зайдем.

Добавлено через 1 минуту
Спасибо COKPOWEHEU, добавил, стало более наглядно
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.10.2017, 15:26
Помогаю со студенческими работами здесь

Непонятные ошибки после закрытия программы
Периодически, после закрытия приложения у меня всплывают разные ошибки, к примеру: - class...

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

Запускаются левые программы, непонятные процессы
НАчалось все с того, что я скачал KMS Activator. вот этот :Ссылка на руторг. И да, я прочитал...

Помогите разобраться, непонятные задержки в работе программы
#define F_CPU 8000000L #define Rect 0 #define Start 3 #define Tba 0 #define Tca 1 #define Tck...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru