Ваш предел цикла неверен. Это заставляет вас оценивать неопределенные данные. Что конкретно не так:
- Не проверяется на успех
scanf
- Не указывать строку формата с ограниченной длиной, чтобы избежать переполнения массива
c[]
.
- Как уже упоминалось, итерация всего массива, а не только данных, которые вы предполагаете, была прочитана успешно.
Все это можно исправить, некоторые из них тривиально.
- Проверьте, что
scanf
вернул 1
- Поскольку ваш массив
c
состоит из 15 символов, а для завершающего nullchar необходимо учитывать пробел, используйте %14s
в качестве строки формата
- Либо используйте
strlen
в качестве предела для for (каким-то образом, будь то сохранение во временном или непосредственно в условном предложении), либо используйте указатель.
Что касается последнего элемента, я предпочитаю последний, так как вы сканируете строку один раз . strlen
будет сканировать строку, чтобы найти терминатор, таким образом вычисляя длину и возвращая ее. Сканирование его снова во время итерации затем следует. Вы можете исключить сканирование strlen
, просто не используя его, а вместо этого использовать указатель и прекратив сканирование при обнаружении терминатора.
Переписано, вот результат:
#include <stdio.h>
#include <ctype.h>
int main()
{
char c[15];
int j = 0;
printf("Give surname: ");
if (scanf("%14s", c) == 1)
{
for (const char *p = c; *p; ++p)
{
if (isalpha(*p))
{
printf("%c ", *p);
++j;
}
}
printf("\nNumber of characters: %d", j);
}
return 0;
}
Input
123john456
выход
j o h n
Number of characters: 4