Подсчет символов в С - PullRequest
       12

Подсчет символов в С

5 голосов
/ 19 сентября 2010

Я пытаюсь написать программу, которая считает все символы в строке.Первоначально он у меня был, но потом я понял, что не могу сосчитать пробелы.Я не понимаю, почему это не работает.

for(m=0; z[m] != 0; m++) {
    if(z[m] != ' ') {
        charcount ++;
    }
}

Любая помощь приветствуется.

Редактировать * Имеет ли значение, если вход (строки) сканируется таким образом?И да, все инициализировано.Я попытался напечатать то, что вычисляет z [m], и это не фактическое значение строки в «m», я думаю, что это проблема.

for(j=0; j<7; j++){
    printf("Enter a string:\n");
    scanf("%s", z);
        for(m=0; z[m] != 0; m++){
                if(z[m] != ' '){
                charcount ++;
                }
        }

Ответы [ 4 ]

6 голосов
/ 19 сентября 2010

Вам нужно инициализировать 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)

4 голосов
/ 19 сентября 2010

Можно использовать strlen()

Я бы предложил использовать цикл while и использовать более значимые имена переменных

m = textIndex 
z = text

Что-то вродеэто будет работать

while (text[textIndex] != 0x00)
{
  textIndex++;
}
2 голосов
/ 19 сентября 2010

Вместо использования scanf попробуйте fgets так:

char input[256];
fgets(input, sizeof(input), stdin);

fgets будет читать всю строку из файла. Таким образом, передача stdin в качестве дескриптора файла сделает его читаемым из стандартного ввода, который в большинстве случаев будет привязан к консоли. Однако следует обратить внимание на то, что строка, которую вы получаете из fgets, может содержать символ новой строки. Вместо того, чтобы явно проверять строки на наличие неравенства с помощью пробела (''), я предлагаю использовать функцию isspace из ctype.h, которая будет проверять различные формы пробелов (включая обычный пробел и символ новой строки).

Вот полный, работающий пример:

#include <stdio.h>
#include <ctype.h>

int count_nonspace(const char* str)
{
 int count = 0;
 while(*str)
 {
  if(!isspace(*str++))
   count++;
 }
 return count;
}

int main()
{
 char input[256];
 fgets(input, sizeof(input), stdin);
 printf("%d\n", count_nonspace(input));
}
0 голосов
/ 19 сентября 2010

Да, есть разница при сканировании ввода с помощью scanf:

    scanf("%s", z);
...
                if(z[m] != ' '){

scanf ("% s" ...) всегда разрывается на пробел, поэтому ваш , если когда-либо имеет значение true . Лучше использовать fgets для чтения со стандартного ввода,

#define MAXINPUT 80
char line[MAXINPUT];
for(j=0; j<7; j++) {
  printf("Enter a string:\n");
  if( fgets( line, 80, stdin ) )
  {
    char *c=line;
    if( strchr(line,'\n') ) *strchr(line,'\n')=0;
    while( *c )
    {
      if( *c!=' ' )
        ++charcount;
      ++c;
    }
  }
}

Или, если вы хотите WHITE -пространства, тогда возьмите

#include <ctype.h>
...
if( !isspace(*c) )
...