#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:
У вас есть два вида проблем:
- связанный с логикой
- связанный с 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 вы абсолютно правы, я не прочитал исходный код! Подождите, я это исправлю!