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

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

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

Есть банальный код, который спрашивает у пользователя логин и пароль и записывает данные в переменные login и pass сответственно, и есть управляющие строковые переменные id и id_end со значениями lg и end. Задача стоит соединить все переменные в одну строку, разделив их знаками пробела и засунуть в сокет(последний шаг не ваажен). Собственно вот код:
int auth(void){
 
int sd;
char login[30], pass[30];
char id[3] = "lg ";        //Здесь я заранее вставил пробел после первого параметра id
char id_end = "end\n"; 
char buf[300];
 
//Ради краткости, здесь порпущена инициализация сокета
 
while (1){
memset(login, 0, sizeof(login));
memset(pass, 0, sizeof(pass));
memset(buf, 0, sizeof(buf));
 
printf("Enter login:\n");
scanf("%s ", login);
printf("Enter password:\n");
scanf("%s ",pass);
 
//Дальше я патался объединять строки функцией strcat
 
strcat(buf, id);
strcat(buf, login);
strcat(buf, pass);
strcat(buf, id_end);
 
printf("%s\n", buf);
//ну и засовываем buf в сокет........
send(sd, buf, strlen(buf)+1);
}
return 0;
}
собственно должны получить строку вида: id login pass id_end\n id - что бы сервер опознал, что за действие делать(авторизация)(id = lg) login, pass - собственно значения id_end - говорит серверу, что текущий запрос завершился Проблема в организации пробелов между этими идентификаторами. Функция scanf(как написано в спецификации) считывает до первого пробела, поэтому написать scanf("%s ", blabla) не прокатывает(пробел, который идет за спецификатором не пишется). Функция gets считывает все подряд, но тогда необходимо пользователю ставить пробел(тоже не катит). Собственно вопрос. Как сделать все грамотно?? И до кучи покритикуйте кусок этого кода...

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

textual
Листинг программы
std::string user, pass;
std::cin >> user >> pass;
std::stringsteam ss;
ss << id << " " << user << " " << pass << " " << id_end;
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
Похожие ответы