Запись пробелов вместе с вводом данных через поток ввода/вывода - C (СИ)
Формулировка задачи:
Есть банальный код, который спрашивает у пользователя логин и пароль и записывает данные в переменные login и pass сответственно, и есть управляющие строковые переменные id и id_end со значениями lg и end. Задача стоит соединить все переменные в одну строку, разделив их знаками пробела и засунуть в сокет(последний шаг не ваажен). Собственно вот код:
собственно должны получить строку вида:
id login pass id_end\n
id - что бы сервер опознал, что за действие делать(авторизация)(id = lg)
login, pass - собственно значения
id_end - говорит серверу, что текущий запрос завершился
Проблема в организации пробелов между этими идентификаторами.
Функция scanf(как написано в спецификации) считывает до первого пробела, поэтому написать scanf("%s ", blabla) не прокатывает(пробел, который идет за спецификатором не пишется). Функция gets считывает все подряд, но тогда необходимо пользователю ставить пробел(тоже не катит).
Собственно вопрос. Как сделать все грамотно?? И до кучи покритикуйте кусок этого кода...
Листинг программы
- 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;
- }
Решение задачи: «Запись пробелов вместе с вводом данных через поток ввода/вывода»
textual
Листинг программы
- std::string user, pass;
- std::cin >> user >> pass;
- std::stringsteam ss;
- ss << id << " " << user << " " << pass << " " << id_end;
- std::string buf = ss.str();
Объяснение кода листинга программы
- Объявляются две переменные типа std::string:
user
иpass
. - Ввод данных через поток ввода/вывода std::cin. Вводится строка, которую сохраняем в переменной
user
, затем вводим следующую строку и сохраняем в переменнойpass
. - Объявляется объект типа std::stringsteam с именем
ss
. - В объект
ss
записывается последовательность символов, начинающаяся сid
, затем следует пробел, затемuser
, еще один пробел, затемpass
, и в конце еще один пробел иid_end
. - Метод .str() вызывается для объекта
ss
, чтобы получить строку, которую сохраняем в переменнойbuf
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д