Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
0 / 0 / 1
Регистрация: 29.09.2019
Сообщений: 117
1

Строки.Ограничение строк

04.11.2019, 15:36. Показов 2862. Ответов 12

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста.Как поставить ограничение на ввод текста:
1)Если слово больше 20 символов, то программа должна выдать "Error word" и завершить работу.
2)Если в предложении больше 30 слов, то программа должна выдать "Error sentence" и завершить работу.
3)Если в предложении символы отличные от латиских букв и пробелов, то программа должна выдать "Error symbol" и завершить работу.


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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include<stdio.h>
#include<string.h>
void main()
{
    char* golosni;
    int i, j, n, max_i, kilkist, max_k, dovzhR,q,d;
    float chastka, chmax, k, dovzhS;
    char s, ss;
    char rechennya[100];//массив для слова
    fgets(rechennya,100,stdin);
    puts(rechennya);
    
    for (i = 0, s = ' ',q=0; i <= 100; i++)
    {
        ss = s; 
        if (s == ' ')continue;
        if (s == '.')break;
        if (s == ',')break;
        if (s == '!')break;
        if (s == '?')break;
        if (ss == ' ')q = 0;
        rechennya[q][d] = s; q++;
    }
    if (i == 30 || q == 0)
        printf("Error sentence\n"); 
    else
    {
        rechennya[q][d] = '\0';
    }
    golosni = "AaOoUuEeIiYy";
    printf("Rechennya: %s\n\n", rechennya);
    dovzhR = strlen(rechennya);
    n = 12;
    chmax = 0;
    dovzhS = 0;
    k = 0;
    for (i = 0; i < dovzhR; i++)
    {
        if ((rechennya[i] != ' ') && (rechennya[i] != '.'))
        {
            printf("%c", rechennya[i]);
            for (j = 0; j < n; j++)
                if (tolower(rechennya[i]) == golosni[j])
                    k++;
            dovzhS++;
        }
        else
        {
            chastka = k / dovzhS;
            printf("\t\t%f\n", (float)k / dovzhS);
            if (chastka > chmax)
            {
                chmax = chastka;
                max_k = k;
                max_i = i - dovzhS;
                kilkist = dovzhS;
            }
            dovzhS = 0;
            k = 0;
        }
    }
    printf("Slovo z naibil'shoyu chastkoyu golosnikh: \n\n");
    for (i = max_i; i < (max_i + kilkist); i++)
        printf("%c", rechennya[i]);
    printf("\t\t%f\n", (float)max_k / kilkist);
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.11.2019, 15:36
Ответы с готовыми решениями:

Убрать ограничение на размер строки
Можно как нибудь убрать ограничение на размер вводимой строки Вроде объявление в 11 и 26 строке...

Получить из данных строк новую, объединив N первых символов строки S1 и N2 последних символов строки S2
Здравствуйте, не могли бы вы помочь мне с этим заданием? Даны два числа: N1 и N2, и две строки: S1...

Получить из строк новую, объединив N1 первых символов строки S1 и N2 последних символов строки S2
Ребят, помогите решить пожалуйста. Заранее спасибо. Даны два числа: N1 и N2, и две строки: S1 и...

Строки. Сравнение строк
Мне нужна помощь в задачке по строкам. У меня вводится две строки, если во второй строке(в любой...

12
200 / 236 / 33
Регистрация: 29.03.2019
Сообщений: 667
04.11.2019, 17:51 2
Zoobbl4, вообще это делается несколько иначе. Пунктом 3 вам обозначили условие при котором текст считается некорректным. Пишем функцию на валидность введенного символа:
C
1
2
3
4
int
isvalid (int symbol) {
  return isalpha(symbol) || isspace(symbol)
}
С помощью этой функции мы проверяем очередной символ на предмет валидности. В случае некорректности символа прерываем выполнение программы и выводим сообщение об ошибке. Поехали дальше. Общая задача заключается в том чтобы разделить текст на слова. При этом на текст есть ограничение сверху (не больше 30 слов). Заводим массив для слов и выделим память под 30 элементов:
C
1
char **  word_array = malloc(sizeof(char *) * 30);
Мы выделили память под весь текст. Для каждого слова в отдельности нам также понадобится выделить память. Однако, делать это станем по мере поступления слов. Для выделения слова нам понадобится функция match_word:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int
match_word (char * dest, char * src) {
  /* счетчик символов, ограничение на длину слова = 20 символов */
  int counter = 0
  /* "занулим" буффер */
  bzero(dest, 21);
 
  while ((counter < 20) && *string && isalpha(*string)) {
    /* буффер под слово dest выделенный вызывающей стороной имеет размер 21 байт */
    dest[counter] = *string;
    counter++;
    string++;
  }
  /* возвращаем количество считанных символов + текущий если он латинского алфавита */
  return counter + isalpha(*string);
}
Проверим значение match_word и по результатам либо сигнализируем об ошибке, либо выделим память под слово и скопируем его в массив. Не забываем проверить сколько слов содержит массив и освободить память как в случае ожидаемого поведения программы, так и в случае необходимости сигнализации об ошибке.
2
из племени тумба-юбма
2467 / 1790 / 417
Регистрация: 29.11.2015
Сообщений: 8,692
Записей в блоге: 15
04.11.2019, 19:31 3
По мне так, очень здорово расписано, спасибо. Для ТС не знаю как будет.
0
0 / 0 / 1
Регистрация: 29.09.2019
Сообщений: 117
05.11.2019, 16:11  [ТС] 4
Что я сделал не так
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
int isvalid(int symbol) {
    return isalpha(symbol) || isspace(symbol);
}
 
int match_word(char* dest, char* src) {
    /* счетчик символов, ограничение на длину слова = 20 символов */
    int counter = 0;
        /* "занулим" буффер */
     bzero(dest, 21);
 
    while ((counter < 20) && *string && isalpha(*string)) {
        /* буффер под слово dest выделенный вызывающей стороной имеет размер 21 байт */
        dest[counter] = *string;
        counter++;
        string++;
    }
    /* возвращаем количество считанных символов + текущий если он латинского алфавита */
    return counter + isalpha(*string);
}
 
void main()
{
    char** word_array = malloc(sizeof(char*) * 30);
    char* golosni;
    int i, j, n, max_i, kilkist, max_k, dovzhR, q, d;
    float chastka, chmax, k, dovzhS;
    char s, ss;
    char rechennya[20];//массив для слова
    fgets(rechennya,20, stdin);
    puts(rechennya);
 
    for (i = 0, s = ' ', q = 0; i <= 19; i++)
    {
        ss = s;
        if (s == ' ')continue;
        if (s == '.')break;
        if (s == ',')break;
        if (s == '!')break;
        if (s == '?')break;
        if (ss == ' ')q = 0;
        rechennya[q] = s; q++;
    }
    if (i == 20 || q == 0)
        printf("Error sentence\n");
    else
    {
        rechennya[q]= '\0';
    }
    golosni = "AaOoUuEeIiYy";
    printf("Rechennya: %s\n\n", rechennya);
    dovzhR = strlen(rechennya);
    n = 12;
    chmax = 0;
    dovzhS = 0;
    k = 0;
    for (i = 0; i < dovzhR; i++)
    {
        if ((rechennya[i] != ' ') && (rechennya[i] != '.'))
        {
            printf("%c", rechennya[i]);
            for (j = 0; j < n; j++)
                if (tolower(rechennya[i]) == golosni[j])
                    k++;
            dovzhS++;
        }
        else
        {
            chastka = k / dovzhS;
            printf("\t\t%f\n", (float)k / dovzhS);
            if (chastka > chmax)
            {
                chmax = chastka;
                max_k = k;
                max_i = i - dovzhS;
                kilkist = dovzhS;
            }
            dovzhS = 0;
            k = 0;
        }
    }
    printf("Slovo z naibil'shoyu chastkoyu golosnikh: \n\n");
    for (i = max_i; i < (max_i + kilkist); i++)
        printf("%c", rechennya[i]);
    printf("\t\t%f\n", (float)max_k / kilkist);
    return 0;
}
0
200 / 236 / 33
Регистрация: 29.03.2019
Сообщений: 667
05.11.2019, 16:23 5
Цитата Сообщение от Zoobbl4 Посмотреть сообщение
Что я сделал не так
Ну, грубо говоря, всё. Возможно вам будет проще если вы разберете задачу на подзадачи и станете решать их последовательно. Начните с того что весь текст надо прочитать и где-то сохранить. При этом ввод не обязательно должен быть из потока stdin. Пусть это будет любой поток ввода. Когда решите эту задачу, приступим к решению следующей. Таким образом, по кирпичику вместе и построим вашу программу.
0
0 / 0 / 1
Регистрация: 29.09.2019
Сообщений: 117
05.11.2019, 17:46  [ТС] 6
Ввод текста после знаков точки,запятой,знака вопроса и вопросительного знака программа перестает печатать


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
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#include<locale.h>
int isvalid(int symbol) {
    return isalpha(symbol) || isspace(symbol);
}
int main()
{
    setlocale(LC_ALL, "rus");
    char str[20], ch,q;
    int i;
    char s, ss;
    printf("\nВвод текста:\n");
    gets(str);
    for (i = 0, s = ' ', q = 0; i <= 19; i++)
    {
        ss = s;
        if (s == ' ')continue;
        if (s == '.')break;
        if (s == ',')break;
        if (s == '!')break;
        if (s == '?')break;
        if (ss == ' ')q = 0;
    }
    if (i == 20 || q == 0)
        printf("Error sentence\n");
    else
    {
        str[q] = '\0';
    }
    return;
Добавлено через 51 минуту
может вот так можно как то ограничить.Если Count больше 30 то мы печатаем ошибку и ретерн
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
main() {
    char str[255];
    int i, count, flag;
    gets(str);
    count = 0;
    flag = 0;
    for (i = 0; str[i] != '\0'; i++)
        if (str[i] != ' ' && flag == 0) {
            count += 1;
            flag = 1;
        }
        else
            if (str[i] == ' ') flag = 0;
    printf("%d\n", count);
}
0
200 / 236 / 33
Регистрация: 29.03.2019
Сообщений: 667
05.11.2019, 22:18 7
Лучший ответ Сообщение было отмечено Zoobbl4 как решение

Решение

Цитата Сообщение от Zoobbl4 Посмотреть сообщение
Ввод текста после знаков точки,запятой,знака вопроса и вопросительного знака программа перестает печатать
Кроме этих, есть еще и другие знаки. В таблице ASCII кодов их 255, так что проверку придется ограничить. Проверять символы на корректность, а не на не корректность. Напишите программу, которая читает файл (любой, не только stdin) в буффер. Это будет первый шаг. После этого приступим к разбору содержимого буффера.

Добавлено через 2 минуты
Пусть прототип функции чтения файла выглядит так:
C
1
int with_open_file (FILE * pointer, char * buffer)
Добавлено через 32 секунды
Цитата Сообщение от zeroalef Посмотреть сообщение
Проверять символы на корректность, а не на не корректность.
Этим занимается функция isvalid.
0
0 / 0 / 1
Регистрация: 29.09.2019
Сообщений: 117
06.11.2019, 17:43  [ТС] 8
Можете подсказать пожалуйста как можно посчитать количество букв(символов) в тексте
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
#include <stdio.h>
#include<locale.h>
 
 
 
main() {
    setlocale(LC_ALL, "rus");
    char str[255];
    int i,s,q,ss, count, flag;
    gets(str);
    count = 0;
    flag = 0;
    int N = strlen(str);
    for (i = 0; str[i] != '\0'; i++)
        if (str[i] != ' ' && flag == 0) {
            count += 1;
            flag = 1;
        }
        else
            if (str[i] == ' ') flag = 0;
/***********************************************************************************************************************************************************************************/
    if (count>30)                         
    {
        printf("Error sentence");                                   //Проверка на количество слов
        return;
    }                                                 
/***********************************************************************************************************************************************************************************/
0
200 / 236 / 33
Регистрация: 29.03.2019
Сообщений: 667
07.11.2019, 00:55 9
Zoobbl4, вот так вы можно считать файл в буффер, а дальше необходимо выделить из него слова и провести остальные вычисления. Ввод завершается символом EOF (C^d или C^z).
Кликните здесь для просмотра всего текста
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
54
55
56
57
58
59
60
61
62
63
64
65
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <ctype.h>
#include <string.h>
#include <errno.h>
 
#ifndef __HAVE_BZERO
#define bzero(p,s) memset(p, 0, s);
#endif
 
#ifdef BUFSIZ
#undef BUFSIZ
#define BUFSIZ (1u << 10)
#endif
 
 
int
read_file (char ** dest, FILE * stream) {
  size_t increase = BUFSIZ;
  size_t bytes = 0;
  char * ptr = malloc( BUFSIZ );
 
  if ( ptr == NULL ) {
    perror("malloc error: ");
    return -1;
  }
 
  while ( 1 ) {
    bytes = fread( ptr, sizeof(char), increase + 1, stream );
    ptr[bytes + 1] = '\0';
 
    if ( feof( stream ) ) {
      break;
    } else {
      increase += BUFSIZ;
      ptr = realloc( ptr, sizeof(char) * (increase + 1) );
 
      if ( ptr == NULL ) {
        perror("realloc error: ");
        return -1;
      }
    }
  }
  *dest = ptr;
  return 0;
}
 
int
main(int argc, char ** argv)
{
  char * buffer = NULL;
  /*
  const char * filename = "./filename";
  FILE * fp = fopen( filename, "r" );
  */
  
  /* ниже функция считывания потока в буффер. В качестве указателя на файл передается открытый stdin */
  read_file( &buffer, stdin );
  fprintf(stdout, "%s\n", buffer);
  free(buffer);
  fclose(fp);
 
  return 0;
}
0
11 / 2 / 1
Регистрация: 01.11.2018
Сообщений: 42
07.11.2019, 01:20 10
zeroalef, чисто теоретически, сколько памяти будет хавать процесс, если будет 20-30-надцать фдшников с большим кол-вом символов?
0
200 / 236 / 33
Регистрация: 29.03.2019
Сообщений: 667
07.11.2019, 01:25 11
poppy1, вы автор, вы и считайте сколько вам потребуется памяти для работы. К чему вопрос? Чисто теоретически.
0
11 / 2 / 1
Регистрация: 01.11.2018
Сообщений: 42
07.11.2019, 01:27 12
zeroalef, я как то делал схожую тему, только там по строчке брал в массив. На тесте с 30ю фдшниками у меня система повисла) аир 12 года просил рестарт) mem leak зло
0
200 / 236 / 33
Регистрация: 29.03.2019
Сообщений: 667
07.11.2019, 02:15 13
poppy1, возможно стоило пересмотреть алгоритм. В данном случае:
1. проблема не предвидится
2. mem leak это совсем другое
Zoobbl4, в прошлом посте сплошная лажа. Вот так корректно:
Кликните здесь для просмотра всего текста
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
54
55
56
57
58
59
60
61
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <ctype.h>
#include <string.h>
#include <errno.h>
 
#ifndef __HAVE_BZERO
#define bzero(p,s) memset(p, 0, s);
#endif
 
#ifdef BUFSIZ
#undef BUFSIZ
#define BUFSIZ (256)
#endif
 
 
int
read_file (char ** dest, FILE * stream) {
  size_t increase = 0;
  size_t bytes = 0;
  char buf[BUFSIZ];
  char * ptr = NULL;
 
  while ( 1 ) {
    bzero( &buf[0], BUFSIZ );
    bytes = fread ( &buf[0], sizeof(char), BUFSIZ, stream );
 
    if ( bytes > 0 ) {
      increase += bytes;
      ptr = realloc( ptr, sizeof(char) * (increase + 1) );
      memmove(ptr + (increase - bytes), &buf[0], sizeof(char) * bytes);
      ptr[increase] = '\0';
    }
    if ( ferror(stream) ) {
      fprintf( stderr, "%s: ", strerror(errno));
      ptr == NULL ? free(ptr) : ptr;
      return -1;
    }
    if (feof(stream)) {
      break;
    }
  }
  *dest = ptr;
  return 0;
}
 
int
main(int argc, char ** argv)
{
  char * buffer = NULL;
  const char * filename = "./main.js";
  FILE * fp = fopen( filename, "r" );
 
  read_file( &buffer, fp );
  fprintf(stdout, "%s\n", buffer);
  free(buffer);
  fclose(fp);
 
  return 0;
}
0
07.11.2019, 02:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.11.2019, 02:15
Помогаю со студенческими работами здесь

Присваивания строки массиву строк
Доброй ночи! Есть код: char a; char b; ... b = a; На последней строке...

Ввод первой строки массива строк
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;string.h&gt; int main() { int n,i; ...

Подстроки строки перенести в массив строк
Есть строка. Подстроки в ней разделены пробелами. Нужно из этой строки подстроки перенести в массив...

Сортировка строк в матрице по наибольшему элементу строки
Написала код сортировки строк матрицы по возрастанию максимальных элементов строк. Не пойму почему...

Упорядочить матрицу ее строки по неубыванию наибольших элементов строк
Написал программу, не могу понять почему она не выводит то, что нужно, помоги пожалуйста кто может!...

Упорядочить строки матрицы по невозрастанию максимальных элементов строк
Дана действительная матрица размером m * n: упорядочит строки матрицы по невозрастанию максимальных...


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

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