sscanf
с %s
будет читать до следующего пробела; он не знает, чтобы искать двоеточие. Итак, вместо этого: сначала найдите :
в hostName
, используя strchr
, и только затем используйте sscanf
(или, лучше, что-то вроде atoi
) для анализа номера порта. unsigned int
или любой тип long
будет достаточно длинным для вашего номера порта на любой платформе; int
будет достаточно длинным для всего, кроме небольшой встроенной вещи с 16-битными целыми числами (где номера портов с установленным верхним битом превратятся в отрицательные числа, которые вы, вероятно, не хотите).
(643246 не является допустимым номером порта; номера портов только 16 бит. Они варьируются от 0 до 65535.)
ИЗМЕНЕНО, чтобы добавить какой-то фактический код на случай, если неясно, что я предлагаю:
const char * colon = strchr(hostName, ':');
memcpy(hostNameChar, hostName, colon-hostName);
hostNameChar[colon-hostName];
port = atoi(colon+1);
Снова отредактировал, чтобы подтвердить правильное замечание Марка Лозера о том, что atoi
не проверяет ошибки. Чтобы сделать вышеописанный код пригодным для производства, вы должны (1) проверить возвращаемое значение из strchr
, чтобы не потерпеть неудачу, когда в строке нет двоеточия, (2) проверить его снова, чтобы не потерпеть неудачу, когда есть двоеточие но он длиннее 256 символов (или динамически или что-то выделяет hostNameChar
), (3) используйте strtol
вместо atoi
, (4) проверьте возвращаемое значение из strtol
, чтобы убедиться, что номер порта допустим и (5) проверьте other kinda-return-value из strtol
, чтобы убедиться, что после номера порта нет завершающего мусора. Однако приведенный выше код должен дать общее представление.