Как мне проверить, есть ли специальный символ в строке в C , используя isalpha?

#c #isalpha

#c #isalpha

Вопрос:

Довольно новый для кодирования здесь. Мы работаем с функцией isalpha, и у меня возникают проблемы с ее использованием со строкой. Моя программа предложит пользователю ввести слово, а затем функция проверит, содержит ли слово какие-либо специальные символы. По сути, мой код будет говорить о наличии специального символа только в том случае, если все они являются специальными символами, а не в том случае, если их всего пара. Я предполагаю, что это как-то связано с моим циклом for, но я не могу понять, как заставить его работать. Я искал совсем немного и не могу найти большой помощи в C .

Вот моя функция. Любая помощь приветствуется.

 //*****IsAlphaStr*****
//This function returns true if the cString passed contains all alphabetic characters.
//If the parameter does not contain all alpha characters, a value of false is returned.
bool IsAlphaStr(char wordcheck[25], bool alphabetic)
{
    int i = 0;
    int n = 0;

    for (int i = 0, n = strlen(wordcheck); i < n; i  )
    {   
        if (isalpha(wordcheck[i]) == 0)
            alphabetic = false;
        else
            alphabetic = true;
    }


    return alphabetic;
}
 

Комментарии:

1. Я искал совсем немного и не могу найти мою справку в C . std::all_of . Нет необходимости писать цикл.

2. Подсказка: подумайте о том, что происходит во 2-й раз в цикле. Вы собираетесь присвоить значение alphabetic независимо от того, какое (true или false). И это означает, что вы собираетесь перезаписать все, что произошло на первой итерации цикла … что означает, что первый символ не влияет на конечный результат. Ваш код на самом деле говорит только о наличии специального символа, если он является последним символом.

3. Подсказка — почему вы продолжаете цикл, когда знаете, что в строке есть не альфа-символ?

4. Совет: std::string и настоятельно избегайте символьных буферов фиксированной длины, особенно в качестве аргументов.

5. Мы никогда не использовали это раньше, глава, над которой я работаю, посвящена массивам и CStrings, я почти уверен, что мы должны использовать цикл для прохождения каждого символа в массиве.

Ответ №1:

Попробуйте следующее:

 bool IsAllSpecialCharacters(char wordcheck[25], bool alphabetic)
{
    int i = 0;
    int n = strlen(wordcheck)
    for (int i = 0; i < n; i  )
    {   
        if (isalpha(wordcheck[i])) return false
    }
    return true;
}
 

Ответ №2:

Как уже упоминалось, IsAlphaStr возвращается только true в том случае, если все заданные символы являются алфавитными. Этого можно достичь, добавив a break в false ветвь if условия, что останавливает дальнейшее выполнение for цикла.

         if (isalpha(wordcheck[i]) == 0)
        {
            alphabetic = false;
            break;
        }
 

Вся тестовая программа:

 #include <iostream>

//*****IsAlphaStr*****
//This function returns true if the cString passed contains all alphabetic characters.
//If the parameter does not contain all alpha characters, a value of false is returned.
bool IsAlphaStr(char wordcheck[25], bool alphabetic)
{
    int i = 0;
    int n = 0;

    for (int i = 0, n = strlen(wordcheck); i < n; i  )
    {   
        if (isalpha(wordcheck[i]) == 0)
        {
            alphabetic = false;
            break;
        }
        else
            alphabetic = true;
    }
    return alphabetic;
}

int main()
{
    char test1[25] = "abcdefghijklmnopqrstuvwx";
    char test2[25] = "0123456789ABCDEFGHIJKLMN";
    char test3[25] = "abcdefghijklmnopqres  -A";
    char test4[25] = "abcdefABCDEF";
    bool alphabetic = false;

    alphabetic = IsAlphaStr(test1, alphabetic);
    std::cout << "test1 = " << alphabetic << std::endl;
    alphabetic = IsAlphaStr(test2, alphabetic);
    std::cout << "test2 = " << alphabetic << std::endl;
    alphabetic = IsAlphaStr(test3, alphabetic);
    std::cout << "test3 = " << alphabetic << std::endl;
    alphabetic = IsAlphaStr(test4, alphabetic);
    std::cout << "test4 = " << alphabetic << std::endl;

    return 0;
}
 

Вывод:

 test1 = 1
test2 = 0
test3 = 0
test4 = 1
 

Надеюсь, это поможет?

Комментарии:

1. @time_in_real_time: Всегда пожалуйста. Не забудьте проголосовать, если найдете это полезным.

Ответ №3:

Всем спасибо за помощь, следующий код, похоже, работает хорошо. У меня была переменная alphabetic, объявленная как false, и я изменил ее на true, а затем удалил оператор else, который изменил бы его обратно на true с false. Вот код,

 bool IsAlphaStr(char wordcheck[25], bool alphabetic)
{
    int i = 0;
    int n = 0;

    for (int i = 0, n = strlen(wordcheck); i < n; i  )
    {   
        if (isalpha(wordcheck[i]) == 0)
        alphabetic = false;
    }

    return alphabetic;
}
 

Ответ №4:

У вас есть два вида проблем:

  1. связанный с логикой
  2. связанный с C

Логика такова:

(1) является ли альфа-строка <=> все символы являются альфа-символами

противопоставление

(2) не является альфа-строкой <=> существует по крайней мере один не альфа-символ

следовательно, код выглядит примерно так:

 For all char c in string
   if c is not char return false    <--- (2 in action)
End for

return true <--- (1 in action)
 

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

Если вы хотите изучить C , сайт https://en.cppreference.com/w / является отличным источником информации.

Возможное решение C заключается в следующем:

 #include <string>
#include <iostream>

bool isAlphaStr(const std::stringamp; to_check)
{
  for(auto c:to_check) 
    if(!std::isalpha(c)) return false;
  
  return true;
}

int main()
{
 char string_1[]="Hello world!";
 std::string string_2{"Hello"};

  std::cout << "nIs alpha? " << std::boolalpha << isAlphaStr(string_1);
  std::cout << "nIs alpha? " << std::boolalpha << isAlphaStr(string_2);
}
 

Для сравнения стиля C и стиля C я добавил чистую версию C:

 #include <string.h>
#include <ctype.h> // for isalpha
#include <stdio.h>
#include <stdbool.h>
 
bool isAlphaStr(const char *const to_check)
{
  const size_t n = strlen(to_check);
  for(size_t i=0;i<n;  i) 
    if(!isalpha(to_check[i])) return false;
  
  return true;
}

int main()
{
 char string_1[]="Hello world!";
 char string_2[]="Hello";

 printf("nIs alpha? %d", isAlphaStr(string_1));
 printf("nIs alpha? %d", isAlphaStr(string_2));
}
 

Что касается комментария Вика, вот версия с bool alphabetic переменной:

C :

 #include <string>
#include <iostream>
#include <type_traits>

bool isAlphaStr(const std::stringamp; to_check, bool alphabetic)
{
  if(to_check.empty()) return alphabetic;
  
  for(auto c:to_check) 
    if(!std::isalpha(c)) return false;
  
  return true;
}

int main()
{
 char string_1[]="Hello world!";
 std::string string_2{"Hello"};

 std::cout << "nIs alpha? " << std::boolalpha << isAlphaStr(string_1,false);
 std::cout << "nIs alpha? " << std::boolalpha << isAlphaStr(string_2,false);
}
 

C:

 #include <stdio.h>
#include <stdbool.h>
 
bool isAlphaStr(const char *const to_check, bool alphabetic)
{
  const size_t n = strlen(to_check);

  if(!n) return alphabetic; // empty string special case
  
  for(size_t i=0;i<n;  i) 
    if(!isalpha(to_check[i])) return false;
  
  return true;
}

int main()
{
 char string_1[]="Hello world!";
 char string_2[]="Hello";

 printf("nIs alpha? %d", isAlphaStr(string_1,false));
 printf("nIs alpha? %d", isAlphaStr(string_2,false));
}
 

Комментарии:

1. Я не уверен, что вы имеете в виду при кодировании C , как вы бы делали в C. Мы еще никогда не использовали класс string, и он не появится до следующего семестра, на данный момент кажется, что то, как я это сделал, — единственный способ, который я мог знать.

2. Хорошо, теперь я понимаю, что вы имеете в виду, спасибо за вашу помощь!

3. @MeowBox C — сложный язык, и ему нужно многому научиться. Я просто хотел указать, что кодирование на C в стиле C может иметь плохие побочные эффекты (например, необработанный указатель против интеллектуального указателя, но я думаю, что вы увидите это позже). Хорошего обучения и удачи!

4. @PicaudVincent в исходном коде результат возврата для пустой строки был передан в функцию в качестве alphabetic параметра, тогда как вы изменили поведение, чтобы возвращать true пустую строку. Это принципиально другое. Ваше мнение неудивительно и логично, но в этом случае оно ведет себя по-другому. (Я подозреваю, что исходное поведение, вероятно, было непреднамеренным.)

5. @Wyck вы абсолютно правы, я не прочитал исходный код! Подождите, я это исправлю!