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 count_letters(string text, int length);
и int letters = count_letters(text, length);
верны. Ваш учебный материал должен объяснять это.
Хорошо, это все, что мне нужно было знать. Спасибо
Вам не нужно передавать длину, если строка ссылается на допустимую строку C.
Является ли string
фактическим названием используемого вами типа данных? Вы используете заголовочный файл CS50 cs50.h
?
Строки 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;
}
Это работает. Хороший трюк. Я не знал. Спасибо
Можно вопрос ? здесь- if (isalpha((unsigned char)text[index]))
почему вы использовали unsigned char, когда он работает без него. Какова его важность?
Иногда мне действительно интересно, чему они учат людей на этих курсах CS50....
я только на 2 неделе.
@smbhav: Этот ответ на вопрос C++ объясняет, почему приведение к unsigned char
необходимо с isdigit
. По той же причине он необходим и в C, и тоже с функцией isalpha
. Приведение необходимо только для кодов символов выше 127
, поэтому вам не нужно это для кодов символов ниже этого числа.
@smbhav: Если вас смущает состав unsigned char
, я предлагаю вам пока исключить этот состав. Преподаватель CS50 Дэвид Малан намеренно не использует актерский состав, чтобы не путать учеников. Поскольку вы, вероятно, пока используете только коды символов ниже 127
, маловероятно, что вы столкнетесь с какими-либо проблемами, если пропустите актерский состав. Актерский состав станет важным только тогда, когда вы начнете использовать коды символов больше, чем 127
.
@AndreasWenzel Спасибо за ваше время. Я прочитал этот ответ полностью, но не могу сказать, что мне удалось понять все это. Но, по крайней мере, у меня есть смутное представление, почему это важно. Я думаю, вы правы, Дэвид оставил это на данный момент, как и многие другие темы, которые не обсуждались в первые недели. Я уверен, что в ближайшие недели я узнаю об этом.
@smbhav: Короче говоря, на большинстве платформ char
эквивалентен signed char
, который может представлять значения от -128
до +127
. Однако на некоторых платформах char
эквивалентен unsigned char
, который может представлять значения от 0
до +255
. Функции isalpha
, isdigit
и т. д. ожидают значений в диапазоне от 0
до +255
, т. е. в диапазоне unsigned char.
Если вы не выполняете приведение к unsigned char
и передаете char
с кодом ASCII выше 127
, то, в зависимости от платформы, значение может быть отрицательным, что не могут обработать некоторые реализации isalpha
.
@smbhav: Другая проблема заключается в том, что константа макроса EOF
, которая возвращается несколькими функциями в случае конца файла или ошибки (например, getchar), имеет отрицательное значение (-1
на большинстве платформ). Поэтому, если вы передаете коды символов, которые имеют отрицательное значение (т. е. коды символов выше 127
, хранящиеся в char
на платформах, на которых char
эквивалентен signed char
) в функцию isalpha
, то эта функция не может отличить специальное значение EOF
от фактического код персонажа. [продолжение в следующем комментарии]
@smbhav: [продолжение предыдущего комментария] Эту двусмысленность можно устранить, приведя коды символов к unsigned char
, чтобы они находились в диапазоне от 0
до 255
и, следовательно, никогда не имели отрицательного значения, которое могло бы быть равно EOF
. Однако, как указывалось ранее, все это не является проблемой, если вы не используете коды символов выше 127
, и курс CS50 никогда не требует этого, поскольку все важные коды символов для английского языка имеют значения ниже 127
.
Конечно, это возможно. Вы уже сделали это:
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
Я не совсем уверен, что вы спрашиваете здесь. Вы должны отредактировать и показать пример того, что вы имеете в виду, когда нужна переменная «длина» во всех этих четырех функциях, но все эти функции уже имеют параметр строкового типа. Если вам нужен параметр
int length
вcount_words
, вам нужно поместить его туда самостоятельно.... например,int count_words(string text, int length) ...
.