@pavelilinchik

Как найти в стоке слово наибольшей длины на C++?

Необходимо:
Осуществить взаимодействие клиента и сервера на основе протокола UDP.
Функционирование клиента и сервера реализовать следующим образом:
клиент посылает набор слов, сервер возвращает слово с максимальным количеством букв.

Клиент:
#include <winsock2.h> 
#include <iostream> 
#include <stdlib.h> 
 
#pragma comment(lib,"Ws2_32.lib") 
using namespace std;
 
int main() { 
  WORD wVersionRequested; 
  WSADATA wsaData; 
  wVersionRequested = MAKEWORD(2, 2); 
  WSAStartup(wVersionRequested, &wsaData); 
  struct sockaddr_in peer; 
  peer.sin_family = AF_INET; 
  peer.sin_port = htons(1280); // т.к. клиент и сервер на одном компьютере, пишем адрес 127.0.0.1 
  peer.sin_addr.s_addr = inet_addr("127.0.0.1"); 
  SOCKET s = socket(AF_INET, SOCK_DGRAM, 0); 
  int size = sizeof(peer); 
  char buf[255], b[255]; 
  cout << "Please, enter the string." << endl; 
  cin.getline(buf, 100, '\n'); 
  sendto(s, buf, sizeof(buf), 0, (sockaddr *)&peer, size); 
  if (recvfrom(s, b, sizeof(b), 0, (sockaddr *)&peer, &size) != 0) { 
    b[strlen(b)] = '\0'; //Удаление ненужных символов в конце строки 
    cout << b << endl; 
    cin.get(); 
    } 
  closesocket(s); 
  WSACleanup(); 
  return 0; 
}


Сервер:
#include <winsock2.h> 
#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 
 
#pragma comment(lib,"Ws2_32.lib") 
using namespace std;
 
int main() { 
  WORD wVersionRequested; // максимальный номер версии WinSock
  WSADATA wsaData; // структура для WSAStartup
  wVersionRequested = MAKEWORD(2, 2); // инициализируем WinSock API
  WSAStartup(wVersionRequested, &wsaData); 
 
  SOCKET s = socket(AF_INET, SOCK_DGRAM, 0); // Создаем серверный сокет
 
  struct sockaddr_in local; // Создаем структуру данных соединения
  local.sin_family = AF_INET; // Поле sin_family всегда имеет значение AF_INET
  local.sin_port = htons(1280);  // Слушаем 1280 порт
  local.sin_addr.s_addr = htonl(INADDR_ANY); // Слушаем все сетевые соединения
  int size = sizeof(local); 
  int c = bind(s, (struct sockaddr*)&local, size); // Связываем сокет с соединением
 
  int r = listen(s, 5); // Инициализируем прослушивание сокета
  cout<<"Server is ready!\n"<<endl;
 
  while (true) { // Запускаем бесконечный цикл сервера
    char res[255], b[255]; 
    int length;
    while (recvfrom(s, b, sizeof(b), 0, (sockaddr *)&local, &size) != 0) { 
 
        
   //curlen - текущая длина слов
   //maxlen - максимальная длина слова
   //index - индекс, соответствующий позиции
   //конца самого длинного слова +1
    
char * str = strtok (b," ");
//int curlen = 0, maxlen = 0, index = 0, i;
 
while (str != NULL){
    cout << str << endl;
    str = strtok (NULL," ");}
/*  
 for(i=0;i < strlen(b);i++)
   {
     if(b[i] == ' '|| b[i]=='\0'){
         if(curlen>maxlen){
           maxlen = curlen;
             index = i;
         }
         //если конец строки -> выйти из цикла
        if(b[i]=='\0')break;
         curlen = 0;
      }
      else curlen++;
   }*/
 
//cout << b << endl << strlen (b);
//cout << str << endl;
//cout << maxlen << endl;
 //cout << " " << endl << b;
}
  // Посылает данные на соединенный сокет 
  sendto(s, b, sizeof(b), 0, (struct sockaddr*)&local, size); 
  } 
 
  closesocket(s); //завершаем работу сокета
  //} 
  WSACleanup(); 
}


Я понимаю, что надо сделать, но не могу реализовать. Чтобы вывести слово максимальной длины, необходимо разбить строку на слова, а потом определять длину.
Часть кода, которая в комментариях начиная с цикла "for" определяет длину самого длинного слова, а часть когда перед этим, как раз разделяет строку и выводит отдельно слова.
Но всё вместе я не могу это совместить.
  • Вопрос задан
  • 538 просмотров
Пригласить эксперта
Ответы на вопрос 1
@WAR_VIK
В строке слово наибольшей длины можно найти вот так:
#include <iostream>
#include <string>

int main() {
std::string str{" Hi Bro! How  are you? ";
std::string res{""}, tmp{""};
int len = str.length();
for(int i{0}; i < len; ++i) {
    if(str[i] != ' ') tmp += str[i];
    if(str[i] == ' ' || i == len-1) {
         if(res.length() < tmp.length()) res = tmp;
         tmp = "";
     }
}
std::cout<<res;
return 0;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы