Запись пробелов вместе с вводом данных через поток ввода/вывода - 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.