чтобы найти общее количество букв в строке.пожалуйста, проверьте мой код тоже - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь написать этот код, сборка прошла успешно, но вывод идет только с одним символом.

Я пишу этот код в x-коде.Я получил этот код из курса.который полностью работал над своим кодовым блоком.Я попытался сделать это для кодового блока, но он не работал и для кодового блока.помогите мне, если это не так.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <ctype.h>

int compute(char c, char str[])
{
    int r=0;
    long len=strlen(str);
    int i;

    for (i=0; i<len; i++)
    {
        if (str[i]==c)
        {
            r++;
        }
    }

    return r;
}

int main()
{
    char text[]="C language is a very powerful language that allows programmers to fully control their computers";
    int i;
    long len=strlen(text);

    for (i=0; i<len; i++)
    {
        char c=text[i];
        c= tolower(c);
        text[i]=c;
    }

    bool seen[256];

    for (i=0; i<256; i++)
    {
        seen[i]=false;
    }

    for (i=0; i<len; i++)
    {
        char c= text[i];

        if (seen[c]==true)
            continue;

        seen[c]=true;

        int ocs=compute(c, text);

        if (ocs>0)
        {
            printf("%c  :  %d  -:",c,ocs);
        }

        return 0;
    }
}

Я ожидаю, что это будет-: '': 14 |'а': 8 |'c': 3 |'е': 7 |'f': 2 |'г': 5 |'ч': 2 |«я»: 2 |'l': 8 |'м': 3 |'n': 3 |'o': 7 |'p': 3 |'r': 8 |'s': 4 |'т': 6 |'у': 5 |'v': 1 |'w': 2 |'у': 2 |но вывод только это-: 'c': 3

Ответы [ 2 ]

2 голосов
/ 21 июня 2019

Выведите return 0; за пределы цикла for.

0 голосов
/ 21 июня 2019

относительно:

long len=strlen(text);

Функция: strlen() возвращает 'size_t' (фактически, 'unsigned long int'), опубликованный код присваивает это 'long int' Это рискованно.Предложите использовать:

size_t len = strlen( text );

Кстати: обратите внимание на правильное использование горизонтального промежутка для удобства чтения людьми

относительно:

long len=strlen(text);

for (i=0; i<len; i++)
{
    char c=text[i];
    c= tolower(c);
    text[i]=c;
}

этот беспорядок может быть заменен на:

for( size_t i=0; text[i]; i++ )
{
    text[i] = tolower( text[i] );
}

, который останавливает цикл при обнаружении завершающего байта NUL

относительно:

bool seen[256];

for (i=0; i<256; i++)
{
    seen[i]=false;
}

, это можно заменить простым

int seen[ 256 ] = {0};

Помните, что любое значение, отличное от 0, воспринимается как 'true'

Следующий предложенный код:

  1. безупречной компиляции
  2. выполняет требуемую функциональность
  3. содержит соответствующий комментарий для каждого блока кода
  4. использует байт NUL в конце текста для завершения некоторых циклов
  5. избегает «магических» чисел (например, 256)
  6. не включает заголовочные файлы, которые не используются
  7. исправляет логическую ошибку «возврата» внутри конечного цикла

А теперь предложенный код:

#include <stdio.h>  // printf()
#include <ctype.h>  // tolower()

#define MAX_CHAR 256

int main( void )
{
    char text[]="C language is a very powerful language that allows programmers to fully control their computers";

    // set all text to lower case
    for ( int i=0; text[i]; i++ )
    {
        text[i] = (char)tolower( text[i] );
    }

    // init work array to all 0's
    int seen[ MAX_CHAR ] = {0};

    // count how many times each char in text
    for (size_t i=0; text[i]; i++)
    {
        seen[ (int)text[i] ]++;
    }

    // loop through array, displaying each char in text 
    // and how many times it was seen
    for( int i=0; i<MAX_CHAR; i++ ) 
    {
        if( seen[i] )
        {
            printf( "%c  :  %d -:", i, seen[i] );
        }
    }
}

при запуске, это результат:

   :  14 -:a  :  8 -:c  :  3 -:e  :  7 -:f  :  2 -:g  :  5 -:h  :  2 -:i  :  2 -:l  :  8 -:m  :  3 -:n  :  3 -:o  :  7 -:p  :  3 -:r  :  8 -:s  :  4 -:t  :  6 -:u  :  5 -:v  :  1 -:w  :  2 -:y  :  2 -:

предлагаем повторноформатирование вывода для удобства чтения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...