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

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

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

Доброго времени суток. Нужна помощь. Сделал программу сервер для поиска количества слов в строке на С+. Всё бы хорошо, но мне нужно перевести его в чистый С. В Си я плохо разбираюсь. Вот собственно коды: 1) Для сервера
Листинг программы
  1. #include <winsock2.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. /*Функция вычисления количества слов в строке.
  5. Так как в принимаемой строке, вместо символа '\0'(конец строки),
  6. идет символ перевода строки('\n'), мы заменяем его на '\0'
  7. */
  8. int get_word_count (char* str)
  9. {
  10. int result = 0;
  11. for (char* ch = str; *ch != NULL; ch++)
  12. {
  13. if(*ch == '\n')
  14. {
  15. *ch = '\0';
  16. break;
  17. }
  18. //если символ не пробел,
  19. //а следующий символ пробел или перевод строки,
  20. //то нашли слово
  21. if ( *ch != ' ' && ( *(ch + 1) == ' ' || *(ch + 1) == '\n' ) )
  22. result++;
  23. }
  24. return result;
  25. }
  26. int main()
  27. {
  28. WSADATA wsa_data; //структура содержит информацию о проинициализированной нами версии WinsockAPI
  29. int new_socket; // новый сокет полученный после accept
  30. int send_result; // результат для отправления данных
  31. SOCKET listen_socket = INVALID_SOCKET; // сокет
  32. sockaddr_in hints; // структура с информацией о подключении
  33. char rec_buf [512]; // буфер для отправки сообщения серверу
  34. char send_buff [512];// буфер для принятия сообщения от сервера
  35. int result;
  36. result = WSAStartup (MAKEWORD (2, 2), &wsa_data); // инициализация WinSock
  37. if (result != 0) // проверка ошибок
  38. {
  39. printf ("WSAsturtup filed with error %d\n", result);
  40. return 1;
  41. }
  42. memset (&hints, 0, sizeof (sockaddr_in)); //обнуление структуры hints
  43. hints.sin_family = AF_INET; //передача с использованием стека протоколов TCP/IP
  44. hints.sin_port = htons (5050); //порт
  45. hints.sin_addr.s_addr = inet_addr ("192.168.1.133"); // ip адрес
  46. listen_socket = socket (AF_INET, SOCK_STREAM, 0); // создание сокета
  47. if (listen_socket == INVALID_SOCKET) //проверка ошибок
  48. {
  49. printf ("socket failed with error: %ld\n", WSAGetLastError());
  50. WSACleanup ();
  51. return 1;
  52. }
  53. result = bind (listen_socket, (sockaddr*) &hints, sizeof (sockaddr)); // привязка созданного сокета к определённым IP-адресам и портам
  54. if (result == SOCKET_ERROR)//проверка ошибок
  55. {
  56. printf ("bind failed with error %d\n", WSAGetLastError ());
  57. closesocket (listen_socket);
  58. WSACleanup ();
  59. return 1;
  60. }
  61. result = listen(listen_socket, SOMAXCONN); //перевода сокета в состояние прослушивания
  62. if (result == SOCKET_ERROR)//проверка ошибок
  63. {
  64. printf ("listen failed with error %d\n", WSAGetLastError ());
  65. closesocket (listen_socket);
  66. WSACleanup ();
  67. return 1;
  68. }
  69. new_socket = accept (listen_socket, NULL, NULL); // когда сокет находится в состоянии прослушивания (listen) необходимо отслеживать поступление входящих соединений
  70. closesocket (listen_socket); // этот сокет больше не нужен, работаем с new_socket
  71. do
  72. {
  73. result = recv (new_socket, rec_buf, 512, 0); //ждем сообщения от клиента
  74. if(result > 0) //если количество принятых байт > 0, значит клиент прислал сообщение
  75. {
  76. printf ("bytes recieved %d\n ", result); // выводим количество принятых байт
  77. int word_count = get_word_count (rec_buf); // вычисляем длину строки
  78. if (strcmp (rec_buf, "exit") == 0) // если строка равна exit выходим из цикла
  79. break;
  80. sprintf (send_buff, "%d", word_count); // копируем полученное значение длины строки, в передаваему строку
  81. send_result = send (new_socket, send_buff, word_count, 0); //отправляем клиенту длину строки
  82. if(send_result == SOCKET_ERROR)//проверка ошибок
  83. {
  84. printf ("send failed with error %d\n", WSAGetLastError ());
  85. closesocket (new_socket);
  86. WSACleanup ();
  87. return 1;
  88. }
  89. printf ("bytes sended %d\n", send_result); // выводим количество отправленных байт
  90. }
  91. else if(result == 0)
  92. printf ("connection closing\n");
  93. else
  94. {
  95. printf ("recv failed with error %d\n", WSAGetLastError ());
  96. closesocket (new_socket);
  97. WSACleanup ();
  98. }
  99. } while (result > 0);
  100. result = shutdown (new_socket, SD_SEND);
  101. if (result == SOCKET_ERROR)//проверка ошибок
  102. {
  103. printf ("shutdown failed with error %d\n", WSAGetLastError ());
  104. closesocket (new_socket);
  105. WSACleanup ();
  106. return 1;
  107. }
  108. closesocket (new_socket); // закрываем сокет
  109. WSACleanup (); //очищаем wsa
  110.  
  111. return 0;
  112. }
2) Для клиента
Листинг программы
  1. #include <winsock2.h>
  2. #include <stdio.h>
  3. int main()
  4. {
  5. WSADATA wsa_data; //структура содержит информацию о проинициализированной нами версии WinsockAPI
  6. SOCKET connect_socket = INVALID_SOCKET; // сокет
  7. sockaddr_in hints; // структура с информацией о подключении
  8. char send_buffer [512]; // буфер для отправки сообщения серверу
  9. char recv_buffer [512]; // буфер для принятия сообщения от сервера
  10. int result;
  11. int send_result;
  12. result = WSAStartup (MAKEWORD (2, 2), &wsa_data); // инициализация WinSock
  13. if (result != 0) //проверка ошибок
  14. {
  15. printf ("WSAsturtup filed with error %d\n", result);
  16. return 1;
  17. }
  18. memset (&hints, 0, sizeof (sockaddr_in)); //обнуление структуры hints
  19. hints.sin_family = AF_INET; //передача с использованием стека протоколов TCP/IP
  20. hints.sin_port = htons (5050); //порт
  21. hints.sin_addr.s_addr = inet_addr ("192.168.1.133"); // ip адрес
  22. connect_socket = socket (AF_INET, SOCK_STREAM, 0); // создание сокета
  23. if (connect_socket == INVALID_SOCKET) //проверка ошибок
  24. {
  25. printf ("socket failed with error %d\n", WSAGetLastError ());
  26. WSACleanup ();
  27. return 1;
  28. }
  29. result = connect (connect_socket, (sockaddr*) &hints, sizeof (sockaddr_in)); // соединение с сервером
  30. if (result == SOCKET_ERROR) //проверка ошибок
  31. {
  32. printf ( "Unnable to connect to server\n");
  33. closesocket (connect_socket);
  34. WSACleanup ();
  35. return 1;
  36. }
  37. do
  38. {
  39. printf ("Input string: ");
  40. fgets(send_buffer, 512, stdin);
  41. send_result = send (connect_socket, send_buffer, (int) strlen (send_buffer), 0); // отправляем данные серверу
  42. if (result == SOCKET_ERROR) //проверка ошибок
  43. {
  44. printf ("send failed with error %d\n", WSAGetLastError ());
  45. closesocket (connect_socket);
  46. WSACleanup ();
  47. return 1;
  48. }
  49. result = recv (connect_socket, recv_buffer, 512, 0); // ожидаем сообщение от сервера
  50. if (result > 0) // если количество принятых байт > 0, значит сервер прислал сообщение
  51. printf ("String lenght = %s\n", recv_buffer); // вывод сообщение от сервера
  52. else if (result == 0) // если количество принятых байт = 0, значит сервер остановлен
  53. printf ("Connection close\n");
  54. else
  55. printf ("recv failed with error %d\n", WSAGetLastError());
  56. } while (result > 0);
  57.  
  58. result = shutdown (connect_socket, SD_SEND); // отключаем функцию передачи, все данные были переданы
  59. if (result == SOCKET_ERROR) //проверка ошибок
  60. {
  61. printf ("shutdown failed with error%d\n", WSAGetLastError ());
  62. closesocket (connect_socket);
  63. WSACleanup ();
  64. return 1;
  65. }
  66. closesocket (connect_socket); // закрываем сокет
  67. WSACleanup (); // отчищаем wsa
  68. return 0;
  69. }

Решение задачи: «Поиск количества слов в строке»

textual
Листинг программы
  1. for (char* ch = str; *ch != NULL; ch++)

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

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

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

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


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

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

8   голосов , оценка 3.875 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы