Вам нужно инициализировать charcount
.Помимо этого, он должен работать при условии, что z
является массивом символов с нулевым символом в конце, а m
является int
или аналогичным.Я бы, вероятно, написал просто z[m]
, а не z[m] != 0
(так как! 0 = true и 0 = false), но оба работают.Есть более эффективные способы сделать это (хотя в наши дни я уверен, что компилятор будет обрабатывать преобразование этого в цикл на основе указателей).
Вот полный, правильный пример с минимальными правками:
const char * z = "testing one two three";
int m;
int charcount;
charcount = 0;
for(m=0; z[m]; m++) {
if(z[m] != ' ') {
charcount ++;
}
}
Если вы используете какой-то класс String
, а не старомодный массив C с нулевым символом в конце, вы захотите взглянуть на этот класс, чтобы узнать, как его перебрать.
Все вышеперечисленное также предполагает, что вы имеете дело со строками ASCII.Если вы имеете дело со строками в кодировке UTF, вам нужно обрабатывать многобайтовые символы.
Повторное редактирование: это имеет большое значение: scanf
остановит на первомпусто (я забыл это).Однако это может иметь еще большее значение, если вы не правильно объявите z
.(Я бы также рекомендовал использовать ширину поля при использовании scanf
для чтения строк [или избегать scanf
полностью]; в противном случае вы не можете контролировать количество символов, которые он будет пытаться сохранить, и поэтому втеория , ни один буфер никогда не будет достаточно большим, чтобы избежать переполнения. Подробнее здесь: http://www.crasseux.com/books/ctutorial/String-overflows-with-scanf.html)