Запись пробелов вместе с вводом данных через поток ввода/вывода - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д