scanf()
зло - используйте fgets()
, а затем анализируйте.
Деталь не в том, что scanf()
совершенно плох.
1) Спецификаторы формата часто используются слабым образом
char buf[100];
scanf("%s", buf); // bad - no width limit
2) Возвращаемое значение ошибочно не проверяется
scanf("%99[\n]", buf); // what if use entered `"\n"`?
puts(buf);
3) Когда ввод не такой, как ожидалось , не ясно, что остается в stdin
.
if (scanf("%d %d %d", &i, &j, &k) != 3) {
// OK, not what is in `stdin`?
}
у вас могут возникнуть проблемы, если вы попытаетесь смешать вызовы scanf с вызовами getchar или getline.
blockquote>Да. Многие
scanf()
вызовы оставляют завершающий'\n'
вstdin
, которые затем читаются как пустая строкаgetline(), fgets()
.scanf()
не не для чтения строк .getline()
иfgets()
гораздо лучше подходят для чтения строки .Сильно ли изменился scanf с тех пор, как были написаны приведенные выше цитаты?
blockquote>Только так много изменений может произойти без путаницы в кодовой базе. @Джонатан Леффлер
scanf()
остается проблематичным.scanf()
не может принять аргумент (после формата), чтобы указать, сколько символов нужно принять в пункт назначенияchar *
.Некоторые системы добавили дополнительные опции формата, чтобы помочь.
Фундаментальная проблема заключается в следующем:
Пользовательский ввод зло . Более надежно получить ввод текста за один шаг, квалифицировать ввод, затем проанализировать и оценить его успех, чем пытаться сделать все это в одной функции.
Безопасность
Слабость
scanf()
и плохая тенденция кодераscanf()
были золотым прииском для хакеров.IMO, C не имеет надежного набора функций пользовательского ввода.
Я использовал Руководство Beej по Сетевому программированию в прошлом. Это находится в C, не, C++, но примеры хорош. Перейдите непосредственно в раздел 6 для простых примеров программы клиента и сервера.
Если код должен быть простым, то Вы, вероятно, прося пример C на основе традиционных сокетов BSD. Решения как boost::asio
являются, по моему скромному мнению, вполне сложными когда дело доходит до короткого и простого "привет мировой" пример.
Для компиляции примеров Вы упомянули, что необходимо сделать простые меры, потому что Вы компилируете в соответствии с компилятором C++. Я обращаюсь к следующим файлам:
http://www.linuxhowtos.org/data/6/server.c
http://www.linuxhowtos.org/data/6/client.c
от: http://www.linuxhowtos.org/C_C++/socket.htm
Добавляет, что следующее включает в оба файла:
#include <cstdlib>
#include <cstring>
#include <unistd.h>
В client.c, измените строку:
if (connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0)
{ ... }
к:
if (connect(sockfd,(const sockaddr*)&serv_addr,sizeof(serv_addr)) < 0)
{ ... }
, Как Вы видите в C++, необходим, явный бросок.
повышение попытки:: lib asio ( http://www.boost.org/doc/libs/1_36_0/doc/html/boost_asio.html ) это имеет примеры партии.