strtok (
Пожалуйста, пожалуйста, не используйте это. Даже его собственная документация говорит, что никогда не использовать его. Я не знаю, как вы, как программист на Ruby, узнали о его существовании, но, пожалуйста, забудьте об этом.
(int)*token
Это даже не близко к тому, что ты хочешь. Есть две фундаментальные проблемы:
1) Символ * не «содержит» текст. Это указывает на текст. token
относится к типу char*
; следовательно, *token
имеет тип char
. То есть один байт, а не строка. Обратите внимание, что я сказал «байт», а не «символ», потому что имя char
на самом деле неверно - понятный недосмотр со стороны разработчиков языка, потому что Unicode тогда еще не существовал. Пожалуйста, поймите, что char
в основном является числовым типом. Существует нет реального типа текста в C! Интерпретация последовательности char
значений в виде текста просто соглашение .
2) При сотворении в C магические преобразования не выполняются.
Ваш код выполняет захват байта, на который указывает token
(после вызова strtok()
), и преобразует это числовое значение в int. Байт, который отображается с символом 1
, на самом деле имеет значение 49. Снова, интерпретация последовательности байтов как текста - это просто соглашение, и, таким образом, интерпретация байта как символа - просто соглашение - в частности, здесь мы используя соглашение, известное как ASCII. Когда вы нажимаете клавишу 1
на клавиатуре, а затем нажимаете Enter, чтобы запустить программу, цепочка событий, запускаемых командным окном, фактически передает байт со значением 49 в вашу программу. (Точно так же запятая имеет значение 44).
Обе вышеперечисленные проблемы решаются с помощью соответствующих инструментов для разбора ввода. Посмотрите вверх sscanf()
. Тем не менее, вы даже не хотите передавать ввод в вашу программу таким образом , потому что вы не можете поставить пробелы во входных данных - каждое «слово» в командной строке будет передаваться как отдельный запись в массиве argv [].
На самом деле вы должны воспользоваться этим , просто ожидая, что каждая запись в argv [] будет представлять одно число. Вы можете снова использовать sscanf()
для разбора каждой записи, и это будет намного проще.
И наконец:
printf («Ср .:% d», сумма / количество)
Коэффициент sum/count
не даст вам десятичного результата. Деление целого числа на другое целое дает целое число в C, отбрасывая остаток.