Поиск количества слов в строке - C (СИ)
Формулировка задачи:
Доброго времени суток. Нужна помощь. Сделал программу сервер для поиска количества слов в строке на С+. Всё бы хорошо, но мне нужно перевести его в чистый С. В Си я плохо разбираюсь. Вот собственно коды:
1) Для сервера
2) Для клиента
Листинг программы
- #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;
- }
Листинг программы
- #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;
- }
Решение задачи: «Поиск количества слов в строке»
textual
Листинг программы
- for (char* ch = str; *ch != NULL; ch++)
Объяснение кода листинга программы
В данном коде выполняется следующие действия:
str
- инициализируется указатель на строку, с которой будет производиться работа.- В цикле
for
происходит итерация по каждому символу строки, начиная с первого и до последнего. - Условие
*ch != NULL
проверяет, что текущий символ строки не является нулевым символом (т.е. строка не закончилась). - Если условие выполняется, то происходит инкремент указателя
ch
, который указывает на следующий символ в строке. - Если условие не выполняется (т.е. текущий символ является нулевым символом), то цикл завершается. Вышеописанный код выполняет поиск количества слов в строке. Каждое слово в строке выделяется символами пробела, а количество слов определяется как количество ненулевых символов в строке минус 1 (т.к. в строке также присутствует нулевой символ).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д