Поиск количества слов в строке - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Нужна помощь. Сделал программу сервер для поиска количества слов в строке на С+. Всё бы хорошо, но мне нужно перевести его в чистый С. В Си я плохо разбираюсь. Вот собственно коды: 1) Для сервера
#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) Для клиента
#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++)

Объяснение кода листинга программы

В данном коде выполняется следующие действия:

  1. str - инициализируется указатель на строку, с которой будет производиться работа.
  2. В цикле for происходит итерация по каждому символу строки, начиная с первого и до последнего.
  3. Условие *ch != NULL проверяет, что текущий символ строки не является нулевым символом (т.е. строка не закончилась).
  4. Если условие выполняется, то происходит инкремент указателя ch, который указывает на следующий символ в строке.
  5. Если условие не выполняется (т.е. текущий символ является нулевым символом), то цикл завершается. Вышеописанный код выполняет поиск количества слов в строке. Каждое слово в строке выделяется символами пробела, а количество слов определяется как количество ненулевых символов в строке минус 1 (т.к. в строке также присутствует нулевой символ).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.875 из 5
Похожие ответы