Как заставить 'isalpha' перебирать каждый символ строки? - PullRequest
1 голос
/ 29 мая 2019

У меня проблемы с выяснением того, как проверить каждый символ в ключевом слове (argv [1]).Я знаю, что, вероятно, упускаю что-то супер очевидное.: (

Я попытался сохранить строку в массиве, объявив новый int, но все еще та же проблема.

//check to make sure 2nd argument is fully alphabetic
string keyword = argv[1];

for(int i = 0, n = strlen(keyword); i < n; i++)
{
    if(isalpha(keyword[i]))
    {
        printf("Success! \n");
        return 0;
    }
    else
    {
        printf("Invalid key, must be fully alphabetic. \n");
        return 1;
    }
}

Ожидаемый вывод должен быть "Неверный ключ, должен быть полностью алфавитным."для всего, что не полностью алфавитно. Вместо этого оно работает только для начального символа, а не для целого ключевого слова.

Ответы [ 2 ]

2 голосов
/ 29 мая 2019

Не замыкать (путем return ing), если значение не алфавитное; сохранить печать Success и вернуть 0 для завершения всего цикла без выхода из-за не алфавитных символов:

for(int i = 0, n = strlen(keyword); i < n; i++)
{
    if(!isalpha(keyword[i]))
    {
        printf("Invalid key, must be fully alphabetic. \n");
        return 1;
    }
}
printf("Success! \n");
return 0;
1 голос
/ 29 мая 2019

Две проблемы

Не всегда выходить из цикла

@ ShadowRanger

Использовать значения без знака

isalpha(int x) определено для x в диапазоне unsigned char и EOF.Другие отрицательные значения char переопределяют неопределенное поведение.

// if(!isalpha(keyword[i]))
if(!isalpha((unsigned char) keyword[i]))

С упрощенным циклом - strlen() не требуется.

int alexa_alpha_test(const char *keyword) {
  while (*keyword) {
    if(!isalpha((unsigned char) *keyword)) {
      printf("Invalid key, must be fully alphabetic. \n");
      return 1;
    }
    keyword++; 
  }
  printf("Success! \n");
  return 0;
}
...