пытаюсь написать счетчик букв в C - PullRequest
1 голос
/ 04 февраля 2020

Я пытаюсь создать программу, которая подсчитывает количество букв, введенных пользователем. Когда я запускаю свою программу, в строке count_letters(){ // writing the function to count number of letters появляется надпись error: expected ';' after expression? Нужна ли точка с запятой в конце? Я также чувствую, что я не подхожу к этой проблеме правильно, может кто-нибудь, пожалуйста, просветите меня: (

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

int count_letters(); //function to count letters
int number_of_letters; //length of the string input
int letterCount; // counter for number of letters in the string input

int main(void) {
    string text = get_string("Text: "); // getting string input
    number_of_letters = strlen(text); //storing the length of string here
    printf("Number of letters: %i\n", letterCount); //printing the number of letters in the string input

    count_letters() { // writing the function to count number of letters
        for (int i = 0; i < number_of_letters; i++) {
            if (isalpha(text[i])) {
                letterCount++;
            }
        }
    }
}

Ответы [ 4 ]

3 голосов
/ 04 февраля 2020

Хотя вы можете использовать strlen, чтобы получить начальное количество символов в text, в этом нет необходимости. В C последний символ в «строке» - это нуль-заканчивающийся символ '\0' (который имеет значение ASCII 0). Это то, что отличает обычный массив символов от строки. Это то, как все строковые функции знают, когда прекратить сканирование на наличие символов.

Так что вам не нужно заранее знать, сколько символов в строке. Например, возьмите строку "hello", введенную в приглашении "Text: ", где вы объявили.

string text = get_string("Text: ");

Когда вы вводите "hello" в приглашении:

Text: hello

строка хранится в памяти как:

    +---+---+---+---+---+---+
    | h | e | l | l | o |\0 |
    +---+---+---+---+---+---+
    ^
    |
  text

, где указатель text указывает на адрес первого символа строки в памяти. Используя тот факт, что строка заканчивается символом , оканчивающимся нулем , вы можете просто сканировать вперед от начала до достижения '\0' (эквивалентно старому 0).

Вы можете использовать for l oop и выполнять итерации с помощью индексов:

    for (int i = 0; text[i]; i++)
        // do whatever with the character text[i]

Или вы можете использовать указатель и просто увеличивать указатель, чтобы он указывал на следующий символ в строке до '\0' достигнуто:

    string p = text;
    while (*p) {
        // do whatever with *p (the character at that address)
        p++;
    }

Помещение последней версии в вашу функцию int count_letters (string s) (которая передает указатель на вашу строку в качестве параметра функции) и возвращает int, представляющее количество букв ( включая только [a-zA-Z]), ваша функция уменьшается до:

int count_letters (string s)
{
    int n = 0;

    while (*s)                  /* while not the nul-character */
        if (isalpha (*s++))     /* check if current is letter, advance ptr */
            n++;                /* increment letter count */

    return n;                   /* return letter count */
}

Вы * функция 1042 *, не нужно вызывать strlen(), а затем уменьшается до:

int main (void) {

    string text = get_string ("Text: ");

    printf ("Number of letters: %d\n", count_letters(text));
}

Помещение целиком и включая необходимые заголовки, вы должны иметь:

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

int count_letters (string s)
{
    int n = 0;

    while (*s)                  /* while not the nul-character */
        if (isalpha (*s++))     /* check if current is letter, advance ptr */
            n++;                /* increment letter count */

    return n;                   /* return letter count */
}

int main (void) {

    string text = get_string ("Text: ");

    printf ("Number of letters: %d\n", count_letters(text));
}

Пример использования / Вывод

Скомпилировать и связать с libcs50.so, а затем, например, вы могли бы иметь:

$ ./bin/ltrcountcs50
Text: hello world
Number of letters: 10

Понимание того, что «string» в C - это (за исключением неудачного выбора typedef char* string;, используемого CS50), позволяет сканировать символы в строке без необходимости знать, сколько символов включено заранее. (а также помогает понять, почему если не предоставить строку с нулевым символом для какой-либо из строковых функций C, ожидающих строку с нулевым символом *1062* в качестве параметра, то получается Неопределенное поведение - они не могут знать, когда прекратить сканирование символов).

Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.

1 голос
/ 04 февраля 2020

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

Я считаю, что вы допустили небольшую ошибку, возможно, во главе с тем, как работает другой язык. Проблема заключается в том, как вы объявили count_letters ().

Чтобы правильно объявить функцию в C, сначала выйдите из любой существующей функции, затем введите любой тип переменной в качестве типа возврата для вашей функции, имя вашей функции, затем в скобках параметры вашей функции. И после этого код вашей функции может быть вставлен в скобки, как вы это сделали.

Обратите внимание, что вы также можете объявить функцию без кода, а затем поместить код для функции ниже.

И Вы также можете объявить внешнюю строку, чтобы избежать работы с указателями.

Вот пример объявления функции:

int foo(int amount)

Следовательно, ваш код должен выглядеть примерно так:

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

void count_letters(); //function to count letters

int number_of_letters; //length of the string input
int letterCount; // counter for number of letters in the string input
string text;

int main(void) {
    text = get_string("Text: "); // getting string input
    number_of_letters = strlen(text); //storing the length of string here
    count_letters();
    printf("Number of letters: %i\n", letterCount); //printing the number of letters in the string input
}

void count_letters() { // writing the function to count number of letters
    for (int i = 0; i < number_of_letters; i++) {
        if (isalpha(text[i])) {
            letterCount++;
        }
    }
}

Теперь, пожалуйста, извините, если я не понял или правильно ответил на ваш вопрос, я бы с удовольствием улучшил бы себя, если бы мог получить больше деталей. Не имея библиотеки cs50.h, я не могу точно знать, работает ли мой код.

1 голос
/ 04 февраля 2020
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
int count_letters(char *); //function to count letters

int main(void)
{

    char* text = get_string("Text: "); // getting string input
    printf("Number of letters: %i\n", count_letters(text)); //printing the number of letters in the string input
}

int count_letters(char *text)
{ // writing the function to count number of letters

    int letterCount,number_of_letters; //length of the string input
    number_of_letters = strlen(text); //storing the length of string here

    for(int i = 0; i < number_of_letters; i++){
        if(isalpha(text[i]))
         {
            letterCount++;
         }
 return letterCount;
}
1 голос
/ 04 февраля 2020
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
int count_letters(); //function to count letters
int number_of_letters; //length of the string input

//initialize letterCount to 0 so that doing letterCount++ does not add 1 to a garbage value
int letterCount = 0; // counter for number of letters in the string input

//define string as a global value if you don't want to refer to it again and again by pass it as parameter or reference
string text;

void count_letters() { //since it's not returning anything, it's void not integer
    for(int i = 0; i < number_of_letters; i++) {
        if(isalpha(text[i])
            letterCount++;
    }
}
int main(void){

    text = get_string("Text: "); // getting string input
    number_of_letters = strlen(text); //storing the length of string here
    printf("Number of letters: %i\n", letterCount); //printing the number of letters in the string input
}

Надеюсь, это поможет. Все комментарии там, где сделаны какие-либо изменения

...