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

Поиск количества слов в строке

02.03.2016, 21:18. Показов 1547. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Нужна помощь. Сделал программу сервер для поиска количества слов в строке на С+. Всё бы хорошо, но мне нужно перевести его в чистый С. В Си я плохо разбираюсь. Вот собственно коды:
1) Для сервера
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#include <winsock2.h>
#include <stdio.h>
#include <string.h>
 
/*Функция вычисления количества слов в строке.
Так как в принимаемой строке, вместо символа '\0'(конец строки), 
идет символ перевода строки('\n'), мы заменяем его на '\0'
*/
int get_word_count (char* str)
{
    int result = 0;
 
    for (char* ch = str; *ch != NULL; ch++)
    {
        if(*ch == '\n')
        {
            *ch = '\0';
            break;
        }
 
        //если символ не пробел, 
        //а следующий символ пробел или перевод строки,
        //то нашли слово
        if ( *ch != ' ' && ( *(ch + 1) == ' ' || *(ch + 1) == '\n' ) )
            result++;                                                                                                                                                                                                                               
    }
 
    return result;
}
 
int main()
{
  WSADATA wsa_data; //структура содержит информацию о проинициализированной нами версии WinsockAPI
  int new_socket; // новый сокет полученный после accept
  int send_result; // результат для отправления данных
  SOCKET listen_socket = INVALID_SOCKET; // сокет
  sockaddr_in hints; // структура с информацией о подключении
 
  char rec_buf [512];  // буфер для отправки сообщения серверу
  char send_buff [512];// буфер для принятия сообщения от сервера
 
  int result;
 
  result = WSAStartup (MAKEWORD (2, 2), &wsa_data); // инициализация WinSock
 
  if (result != 0) // проверка ошибок
  {
    printf ("WSAsturtup filed with error %d\n", result);
    return 1;
  }
 
  memset (&hints, 0, sizeof (sockaddr_in)); //обнуление структуры hints
  hints.sin_family = AF_INET; //передача с использованием стека протоколов TCP/IP
  hints.sin_port = htons (5050); //порт
  hints.sin_addr.s_addr = inet_addr ("192.168.1.133"); // ip адрес
 
  listen_socket = socket (AF_INET, SOCK_STREAM, 0); // создание сокета
 
  if (listen_socket == INVALID_SOCKET) //проверка ошибок
  {
    printf ("socket failed with error: %ld\n", WSAGetLastError());
    WSACleanup ();
    return 1;
  }
 
  result = bind (listen_socket, (sockaddr*) &hints, sizeof (sockaddr));  // привязка созданного сокета к определённым IP-адресам и портам
 
  if (result == SOCKET_ERROR)//проверка ошибок
  {
    printf ("bind failed with error %d\n", WSAGetLastError ());
    closesocket (listen_socket);
    WSACleanup ();
    return 1;
  }
 
  result = listen(listen_socket, SOMAXCONN); //перевода  сокета  в  состояние  прослушивания 
 
  if (result == SOCKET_ERROR)//проверка ошибок
  {
    printf ("listen failed with error %d\n", WSAGetLastError ());
    closesocket (listen_socket);
    WSACleanup ();
    return 1;
  }
 
  new_socket = accept (listen_socket, NULL, NULL); // когда сокет находится в состоянии прослушивания (listen) необходимо отслеживать поступление входящих соединений
 
  closesocket (listen_socket); // этот сокет больше не нужен, работаем с new_socket
 
  do
  {
    result = recv (new_socket, rec_buf, 512, 0); //ждем сообщения от клиента
 
    if(result > 0) //если количество принятых байт > 0, значит клиент прислал сообщение
    {
      printf ("bytes recieved %d\n ", result); // выводим количество принятых байт
 
            int word_count = get_word_count (rec_buf); // вычисляем длину строки
 
            if (strcmp (rec_buf, "exit") == 0) // если строка равна exit выходим из цикла
                break;
 
            sprintf (send_buff, "%d",  word_count); // копируем полученное значение длины строки, в передаваему строку
            
      send_result = send (new_socket, send_buff, word_count, 0); //отправляем клиенту длину строки
 
      if(send_result == SOCKET_ERROR)//проверка ошибок
      {
        printf ("send failed with error %d\n", WSAGetLastError ());
        closesocket (new_socket);
        WSACleanup ();
        return 1;
      }
 
      printf ("bytes sended %d\n", send_result); // выводим количество отправленных байт
    }
 
    else if(result == 0)
      printf ("connection closing\n");
 
    else
    {
      printf ("recv failed with error %d\n", WSAGetLastError ());
      closesocket (new_socket);
      WSACleanup ();
    }
 
  } while (result > 0);
 
  result = shutdown (new_socket, SD_SEND);
 
  if (result == SOCKET_ERROR)//проверка ошибок
  {
    printf ("shutdown failed with error %d\n", WSAGetLastError ());
    closesocket (new_socket);
    WSACleanup ();
    return 1;
  }
 
  closesocket (new_socket); // закрываем сокет
  WSACleanup (); //очищаем wsa
 
 
  return 0;
}
2) Для клиента
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
90
91
92
93
#include <winsock2.h>
#include <stdio.h>
 
int main()
{
  WSADATA wsa_data; //структура содержит информацию о проинициализированной нами версии WinsockAPI
  SOCKET connect_socket = INVALID_SOCKET; // сокет
  sockaddr_in hints;  // структура с информацией о подключении
 
  char send_buffer [512]; // буфер для отправки сообщения серверу
  char recv_buffer [512]; // буфер для принятия сообщения от сервера
 
  int result;
    int send_result;
 
  result = WSAStartup (MAKEWORD (2, 2), &wsa_data); // инициализация WinSock
 
  if (result != 0) //проверка ошибок
  {
    printf ("WSAsturtup filed with error %d\n", result);
    return 1;
  }
 
  memset (&hints, 0, sizeof (sockaddr_in)); //обнуление структуры hints
  
  hints.sin_family = AF_INET; //передача с использованием стека протоколов TCP/IP
  hints.sin_port = htons (5050);  //порт
  hints.sin_addr.s_addr = inet_addr ("192.168.1.133"); // ip адрес
 
  connect_socket = socket (AF_INET, SOCK_STREAM, 0); // создание сокета
 
  if (connect_socket == INVALID_SOCKET) //проверка ошибок
  {
    printf ("socket failed with error %d\n", WSAGetLastError ());
    WSACleanup ();
    return 1;
  }
 
  result = connect (connect_socket, (sockaddr*) &hints, sizeof (sockaddr_in)); // соединение с сервером
 
  if (result == SOCKET_ERROR) //проверка ошибок
  {
    printf ( "Unnable to connect to server\n");
    closesocket (connect_socket);
    WSACleanup ();
    return 1;
  }
 
    do
    {
        printf ("Input string: ");
 
        fgets(send_buffer, 512, stdin);
 
        send_result = send (connect_socket, send_buffer, (int) strlen (send_buffer), 0); // отправляем данные серверу
 
        if (result == SOCKET_ERROR) //проверка ошибок
        {
            printf ("send failed with error %d\n", WSAGetLastError ());
            closesocket (connect_socket);
            WSACleanup ();
            return 1;
        }
 
        result = recv (connect_socket, recv_buffer, 512, 0); // ожидаем сообщение от сервера
 
    if (result > 0) // если количество принятых байт > 0, значит сервер прислал сообщение
      printf ("String lenght = %s\n", recv_buffer); // вывод сообщение от сервера
 
    else if (result == 0) // если количество принятых байт = 0, значит сервер остановлен
      printf ("Connection close\n");
 
    else
      printf ("recv failed with error %d\n", WSAGetLastError());
 
  } while (result > 0);
 
 
    result = shutdown (connect_socket, SD_SEND); // отключаем функцию передачи, все данные были переданы
 
  if (result == SOCKET_ERROR) //проверка ошибок
  {
    printf ("shutdown failed with error%d\n", WSAGetLastError ());
    closesocket (connect_socket);
    WSACleanup ();
    return 1;
  }
 
  closesocket (connect_socket); // закрываем сокет
  WSACleanup (); // отчищаем wsa
 
  return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.03.2016, 21:18
Ответы с готовыми решениями:

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

Подсчет количества слов в строке
в последней задаче необходимо подсчитать количество слов в строке, оканчивающейся точкой. Как быть...

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

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

5
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1724
Регистрация: 18.10.2014
Сообщений: 16,066
02.03.2016, 22:58 2
Ваш код написан на чистом С и даже использует стандартные С-шные заголовочные файлы. Я не вижу ничего, что требовало бы перевода.

Цитата Сообщение от SuperBor Посмотреть сообщение
Сделал программу сервер для поиска количества слов в строке на С+.
Я не знаю, что такое С+. Однако мне трудно поверить, что делая такую программу самостоятельно на чистом С, вы могли не понимать, что делаете ее на чистом С
0
0 / 0 / 0
Регистрация: 26.11.2015
Сообщений: 16
02.03.2016, 23:52  [ТС] 3
На C++ (поправлюсь) написаны коды. Мне это ещё и преподаватель сказал (надеюсь он действительно не солгал). Запускаю проект на Code Blocks-е и не компилирует, пишет несколько ошибок. Растроен, нужно скоро сдавать курсовую, вот и пишу, чтобы помогли разобраться толковые люди. А у вас всё работает, проверяли?)
0
0 / 0 / 0
Регистрация: 26.11.2015
Сообщений: 16
03.03.2016, 00:13  [ТС] 4
Пример ошибок для сервера
Миниатюры
Поиск количества слов в строке  
0
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1724
Регистрация: 18.10.2014
Сообщений: 16,066
03.03.2016, 02:03 5
Лучший ответ Сообщение было отмечено SuperBor как решение

Решение

Цитата Сообщение от SuperBor Посмотреть сообщение
Пример ошибок для сервера
Ваши ошибки говорят, что ваш код невозможно скомпилировать в устаревшем режиме С89/90. Язык С семнадцать лет назад начал определяться спецификацией С99 и пять лет назад - спецификацией С11. Ваш код должен быть прекрасно компилируем уже в С99. Именно это вам и нужно сделать - перевести ваш компилятор в режим С99.

У вас там в сообщениях сам компилятор ясно вам сказал, что надо использовать опцию '-std=c99'.

И, если я ничего не упускаю, ваш преподаватель заблуждается. Код написан именно на чистом С, хоть и компилируем в С++ тоже.

--------------------

Хотя элемент паразитной С++-ности в коде действительно есть. Это

C++
1
for (char* ch = str; *ch != NULL; ch++)
Значение '*ch' типа 'char' сравнивается с константой 'NULL'! Это бредово как в С, так и в С++, так как и там и там константа 'NULL' предназначена для использования с указателями и только с указателями. Однако в С++ это имеет больше шансов скомпилироваться, ибо в С++ 'NULL' - это всегда целочисленный ноль, а в С это либо целочисленный ноль, либо '(void *) 0'.

Должно было быть

C++
1
for (char* ch = str; *ch != '\0'; ch++)
причем как в С, так и в С++.

--------------------

И, вынужден признать, что настоящая С++-ность в коде таки есть. Sockets API определяет типы 'struct sockaddr' и 'struct sockaddr_in'. На территории С++ кода на них их можно ссылаться как просто 'sockaddr' и 'sockaddr_in'. А вот в С коде придется писать полностью: 'struct sockaddr' и 'struct sockaddr_in'.

Вот это действительно надо исправить, чтобы перевести код на С. Больше ничего не видно.
1
0 / 0 / 0
Регистрация: 26.11.2015
Сообщений: 16
04.03.2016, 22:15  [ТС] 6
Благодарю за ответ. Всё понятно разъяснили. Теперь работает)
0
04.03.2016, 22:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.03.2016, 22:15
Помогаю со студенческими работами здесь

Поиск количества букв в строке
Доброго времени суток. Нужно найти кол-во вхождений букв в строку: #include &lt;stdio.h&gt; #include...

В символьной строке сосчитать число слов, состоящих из нечётного количества букв
Пожалуйста,помогите с программой.Нужно в символьной строке сосчитать число слов, состоящих из...

Файлы: поиск количества слов в строке
Дан текстовый файл F1. Подсчитать количество слов в каждой строке. Результат сохранить в новый...

Как сделать поиск количества слов в строке
Здравствуйте подскажите как сделать поиск количества слов В стрингах. #include &lt;iostream&gt; ...


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

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