Хотя вы можете использовать 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* в качестве параметра, то получается Неопределенное поведение - они не могут знать, когда прекратить сканирование символов).
Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.