Мой цикл for (на языке c) не зацикливается в vscode

В приведенном ниже коде я пытаюсь проверить, является ли каждый символ в массиве строк алфавитным или нет, создавая логическую функцию. Но когда я запускаю программу, моя функция bool не проходит через массив строк, а проверяет только первый символ в массиве строк. Дальнейшая отладка также показывает, что функция действительно не обрабатывает массив строк.

p.s. это тест, который я провел для решения проблемы CS50.

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


bool only_alpha(string a);

int main(void)
{
    string s = get_string("String: ");

    if (only_alpha(s))
    {
        printf("Yes\n");
    }
    else
    {
        printf("No\n");
    }
}

bool only_alpha(string a)
{
    int q = strlen(a);

    //check if each char in string is alphabetical
    
    for(int i = 0; i < q; i++)
    {
        if (isalpha(a[i]))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    return 0;
}

это то, что я получаю, когда запускаю программу. введите сюда описание изображения

Раньше я использовал циклы for и не знаю, что делаю не так, и начинаю думать, что это проблема VScode (после нового обновления), потому что я использовал именно этот код (но с isdigits ). Пожалуйста помоги!!!

Что такое string в вашем коде? Вы typedef делали это раньше?

Iman Abdollahzadeh 08.04.2024 11:43

@ImanAbdollahzadeh Это фейспалм CS50. Новичков учат делать typedef char* string;... и да, это ужасно.

Lundin 08.04.2024 11:44

Пожалуйста, добавьте в свой вопрос текст в виде форматированного текста вместо отображения изображения или обычного текста.

Gerhardh 08.04.2024 11:56

Сейчас самое время отказаться от привычки использовать однобуквенные имена переменных. Вместо этого используйте что-нибудь значимое. Ваш код будет лучше для этого.

Retired Ninja 08.04.2024 12:36

Никаких изображений текста, пожалуйста

klutt 08.04.2024 12:52
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
78
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Логика неправильная, вы всегда return при проверке первой буквы, независимо от того, какая она была. Вместо этого вам следует вернуться к первой недопустимой букве или, если недействительных букв не обнаружено, вернуть true в конце:

for(int i = 0; i < q; i++)
{
    if (!isalpha(a[i]))
    {
        return false;
    }
}
return true;
Ответ принят как подходящий

о, я вижу, вы возвращаете bool из функции слишком рано. Прямо сейчас он проверит, является ли первый символ строки only_alpha алфавитным или нет? если не? на основе пользовательского ввода он вернет a[0]/true и немедленно завершит цикл.

Вместо этого замените цикл на это:

bool only_alpha(string a)
{
    int q = strlen(a);

    for(int i = 0; i < q; i++)
    {
        if (!isalpha(a[i]))
        {
            return false; 
        }
    }
    return true; 
}

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