Возможно ли в C заставить функцию принимать два разных типа переменных в качестве аргумента?

int count_letters(string text, int length);
int count_words(string text);
int count_sentences(string text);
void final(int letters, int words, int sentences);


int main(void)
{
    string text = get_string("Text: \n");
    int length = strlen(text);
   //printf("%i\n",length);

    int letters = count_letters(text, length);

Здесь мне нужна переменная «длина» во всех этих четырех функциях, но все эти функции уже имеют параметр строкового типа. Можно ли передавать в функцию параметры разных типов?

В основном я хочу знать, правильно ли это (строка 1 и строка 13), и если нет, то как я могу использовать эту переменную длины во всех этих функциях без необходимости локально определять ее в каждой функции?

Я не совсем уверен, что вы спрашиваете здесь. Вы должны отредактировать и показать пример того, что вы имеете в виду, когда нужна переменная «длина» во всех этих четырех функциях, но все эти функции уже имеют параметр строкового типа. Если вам нужен параметр int length в count_words, вам нужно поместить его туда самостоятельно.... например, int count_words(string text, int length) ....

Jabberwocky 25.11.2022 20:04

Тогда первая и последняя строки приведенного выше кода верны?

smbhav 25.11.2022 20:10

Но да, оба заявления int count_letters(string text, int length); и int letters = count_letters(text, length); верны. Ваш учебный материал должен объяснять это.

Jabberwocky 25.11.2022 20:12

Хорошо, это все, что мне нужно было знать. Спасибо

smbhav 25.11.2022 20:13

Вам не нужно передавать длину, если строка ссылается на допустимую строку C.

0___________ 25.11.2022 20:16

Является ли string фактическим названием используемого вами типа данных? Вы используете заголовочный файл CS50 cs50.h?

Andreas Wenzel 25.11.2022 21:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
120
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Строки C завершаются нулевым символом. Вам не нужно передавать длину строки в функцию. Вам нужно повторять, пока вы не достигнете этого символа

Пример:

int count_letters(string text)  //better to return size_t
{
    int result = 0;
    for(int index = 0; text[index] != '\0'; index++) 
    {
        if (isalpha((unsigned char)text[index]))
        {
            result += 1;
        }    
    }
    return result;
}

Это работает. Хороший трюк. Я не знал. Спасибо

smbhav 25.11.2022 20:30

Можно вопрос ? здесь- if (isalpha((unsigned char)text[index])) почему вы использовали unsigned char, когда он работает без него. Какова его важность?

smbhav 25.11.2022 21:22

Иногда мне действительно интересно, чему они учат людей на этих курсах CS50....

Jabberwocky 25.11.2022 21:26

я только на 2 неделе.

smbhav 25.11.2022 21:27

@smbhav: Этот ответ на вопрос C++ объясняет, почему приведение к unsigned char необходимо с isdigit. По той же причине он необходим и в C, и тоже с функцией isalpha. Приведение необходимо только для кодов символов выше 127, поэтому вам не нужно это для кодов символов ниже этого числа.

Andreas Wenzel 25.11.2022 21:31

@smbhav: Если вас смущает состав unsigned char, я предлагаю вам пока исключить этот состав. Преподаватель CS50 Дэвид Малан намеренно не использует актерский состав, чтобы не путать учеников. Поскольку вы, вероятно, пока используете только коды символов ниже 127, маловероятно, что вы столкнетесь с какими-либо проблемами, если пропустите актерский состав. Актерский состав станет важным только тогда, когда вы начнете использовать коды символов больше, чем 127.

Andreas Wenzel 25.11.2022 21:39

@AndreasWenzel Спасибо за ваше время. Я прочитал этот ответ полностью, но не могу сказать, что мне удалось понять все это. Но, по крайней мере, у меня есть смутное представление, почему это важно. Я думаю, вы правы, Дэвид оставил это на данный момент, как и многие другие темы, которые не обсуждались в первые недели. Я уверен, что в ближайшие недели я узнаю об этом.

smbhav 25.11.2022 21:53

@smbhav: Короче говоря, на большинстве платформ char эквивалентен signed char, который может представлять значения от -128 до +127. Однако на некоторых платформах char эквивалентен unsigned char, который может представлять значения от 0 до +255. Функции isalpha, isdigit и т. д. ожидают значений в диапазоне от 0 до +255, т. е. в диапазоне unsigned char. Если вы не выполняете приведение к unsigned char и передаете char с кодом ASCII выше 127, то, в зависимости от платформы, значение может быть отрицательным, что не могут обработать некоторые реализации isalpha.

Andreas Wenzel 25.11.2022 22:15

@smbhav: Другая проблема заключается в том, что константа макроса EOF, которая возвращается несколькими функциями в случае конца файла или ошибки (например, getchar), имеет отрицательное значение (-1 на большинстве платформ). Поэтому, если вы передаете коды символов, которые имеют отрицательное значение (т. е. коды символов выше 127, хранящиеся в char на платформах, на которых char эквивалентен signed char) в функцию isalpha, то эта функция не может отличить специальное значение EOF от фактического код персонажа. [продолжение в следующем комментарии]

Andreas Wenzel 26.11.2022 15:26

@smbhav: [продолжение предыдущего комментария] Эту двусмысленность можно устранить, приведя коды символов к unsigned char, чтобы они находились в диапазоне от 0 до 255 и, следовательно, никогда не имели отрицательного значения, которое могло бы быть равно EOF. Однако, как указывалось ранее, все это не является проблемой, если вы не используете коды символов выше 127, и курс CS50 никогда не требует этого, поскольку все важные коды символов для английского языка имеют значения ниже 127.

Andreas Wenzel 26.11.2022 15:32

Конечно, это возможно. Вы уже сделали это:

int count_letters(string text, int length);

count_letters имеет параметр string с именем text и параметр int с именем length.

И я уверен, что вы уже знаете некоторые функции, позволяющие это сделать:

     printf("the magic number is %d\n", 42);
//   ^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^  ^^
// function      const char *           int

Другие вопросы по теме