Запись пробелов вместе с вводом данных через поток ввода/вывода - C (СИ)

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

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

Есть банальный код, который спрашивает у пользователя логин и пароль и записывает данные в переменные login и pass сответственно, и есть управляющие строковые переменные id и id_end со значениями lg и end. Задача стоит соединить все переменные в одну строку, разделив их знаками пробела и засунуть в сокет(последний шаг не ваажен). Собственно вот код:
Листинг программы
  1. int auth(void){
  2. int sd;
  3. char login[30], pass[30];
  4. char id[3] = "lg "; //Здесь я заранее вставил пробел после первого параметра id
  5. char id_end = "end\n";
  6. char buf[300];
  7. //Ради краткости, здесь порпущена инициализация сокета
  8. while (1){
  9. memset(login, 0, sizeof(login));
  10. memset(pass, 0, sizeof(pass));
  11. memset(buf, 0, sizeof(buf));
  12. printf("Enter login:\n");
  13. scanf("%s ", login);
  14. printf("Enter password:\n");
  15. scanf("%s ",pass);
  16. //Дальше я патался объединять строки функцией strcat
  17. strcat(buf, id);
  18. strcat(buf, login);
  19. strcat(buf, pass);
  20. strcat(buf, id_end);
  21. printf("%s\n", buf);
  22. //ну и засовываем buf в сокет........
  23. send(sd, buf, strlen(buf)+1);
  24. }
  25. return 0;
  26. }
собственно должны получить строку вида: id login pass id_end\n id - что бы сервер опознал, что за действие делать(авторизация)(id = lg) login, pass - собственно значения id_end - говорит серверу, что текущий запрос завершился Проблема в организации пробелов между этими идентификаторами. Функция scanf(как написано в спецификации) считывает до первого пробела, поэтому написать scanf("%s ", blabla) не прокатывает(пробел, который идет за спецификатором не пишется). Функция gets считывает все подряд, но тогда необходимо пользователю ставить пробел(тоже не катит). Собственно вопрос. Как сделать все грамотно?? И до кучи покритикуйте кусок этого кода...

Решение задачи: «Запись пробелов вместе с вводом данных через поток ввода/вывода»

textual
Листинг программы
  1. std::string user, pass;
  2. std::cin >> user >> pass;
  3. std::stringsteam ss;
  4. ss << id << " " << user << " " << pass << " " << id_end;
  5. std::string buf = ss.str();

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

  1. Объявляются две переменные типа std::string: user и pass.
  2. Ввод данных через поток ввода/вывода std::cin. Вводится строка, которую сохраняем в переменной user, затем вводим следующую строку и сохраняем в переменной pass.
  3. Объявляется объект типа std::stringsteam с именем ss.
  4. В объект ss записывается последовательность символов, начинающаяся с id, затем следует пробел, затем user, еще один пробел, затем pass, и в конце еще один пробел и id_end.
  5. Метод .str() вызывается для объекта ss, чтобы получить строку, которую сохраняем в переменной buf.

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


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

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

11   голосов , оценка 3.909 из 5

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

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

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