проверка, является ли символ верхним или нижним регистром в буквенно-цифровом

У меня есть этот код C. Если я ввожу LOL123, он должен отображаться в верхнем регистре. И lol123 это в нижнем регистре. Как использовать isalpha для исключения нечислового ввода при проверке isupper или under?

#include <stdio.h>

#define SIZE 6
char input[50];
int my_isupper(char string[]);

int main(){
    char input[] = "LOL123";
    int m;

    m= isupper(input);
    if( m==1){
        printf("%s is all uppercase.\n", input);
    }else
        printf("%s is not all uppercase.\n", input);

    return 0;
}

int my_isupper(char string[]){
    int a,d;

    for (a=0; a<SIZE); a++){
        d= isupper(string[a]) ; 
    }

    if(d != 0)
        d=1;

    return d;
}

person Community    schedule 22.01.2014    source источник
comment
А как же Лол123, лоЛ123, лол123...   -  person rullof    schedule 22.01.2014
comment
Судя по отпечаткам в коде, все они не будут считаться прописными. Спрашивающий, кажется, заботится о том, все ли слова в верхнем регистре или нет.   -  person StephenTG    schedule 22.01.2014
comment
a<sizeof(string) неправильно. вместо этого вы можете использовать for (a=0; string[a] ; a++) {.   -  person wildplasser    schedule 22.01.2014
comment
Ваш оператор if if (isupper(input) == 1) ... неверен. Функции is... (и большинство функций истинного/ложного вообще) могут возвращать любое ненулевое значение, чтобы указать истинность. Правильный путь if (isupper(foo)) { ... } или if (!isupper(foo)) { ... }   -  person Brandin    schedule 22.01.2014
comment
@rullof LOl123 следует рассматривать не только в верхнем регистре.   -  person    schedule 22.01.2014
comment
Имя isupper уже используется стандартной функцией, которую вы пытаетесь использовать внутри своего кода. Поскольку в C нет перегрузки функций, это никогда не сработает. Если вы компилируете свой код с приличным уровнем предупреждений, ваш компилятор должен на вас расплакаться.   -  person Jens Gustedt    schedule 22.01.2014
comment
API-интерфейсы ctype.h также принимают int в качестве формального параметра, поэтому, если вы не планируете иметь дело с high-asci (и крутить европейцев в процессе), вам следует преобразовать эти значения char в unsigned int, чтобы избежать расширения знака. .   -  person WhozCraig    schedule 22.01.2014
comment
@Brandin функция не вернет 1, даже если я установлю ее на «if (d! = 0)», d = 1 и верну d?   -  person    schedule 22.01.2014
comment
@honmayanranger Удалите определение isupper и используйте его в ctype. Если вы хотите сделать свою собственную версию, назовите ее по-другому, например my_isupper.   -  person Brandin    schedule 22.01.2014


Ответы (3)


Для функции верхнего регистра просто прокручивайте строку, и если встречается символ нижнего регистра, вы возвращаете false подобное значение. И не используйте стандартные имена библиотечных функций для именования собственных функций. Вместо этого используйте isUpperCase.

Живая демонстрация: https://eval.in/93429

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

int isUpperCase(const char *inputString);

int main(void)
{
    char inputString1[] = "LOL123";
    char inputString2[] = "lol123";
    printf("%s is %s\n", inputString1, isUpperCase(inputString1)?"upper-case":"not upper-case");
    printf("%s is %s\n", inputString2, isUpperCase(inputString2)?"lower-case":"not upper-case");
    return 0;
}

int isUpperCase(const char *inputString)
{
    int i;
    int len = strlen(inputString);
    for (i = 0; i < len; i++) {
        if (inputString[i] >= 'a' && inputString[i] <= 'z') {
            return 0;
        }
    }
    return 1;
}
person rullof    schedule 22.01.2014
comment
Примечание. Стандарт не дает никаких гарантий относительно свойства sequential символов числового значения, кроме '0'...'9'. Хотя это будет работать на платформах ascii (и даже EBCDIC), это не соответствует стандарту. - person WhozCraig; 22.01.2014
comment
Таким образом, нет способа определить, является ли ввод в верхнем или нижнем регистре, используя только isalpha(), islower() и isupper()? - person ; 22.01.2014

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

Еще несколько наблюдений:

  • Не используйте имя стандартной функции для своего собственного.
  • Массивы распадаются на указатели, когда затем используются в качестве параметров функции. У вас нет возможности автоматически определить размер массива.
  • Вы ожидаете, что ваш доход от isupper будет логическим значением. Тестировать это снова с ==1 не имеет особого смысла.
  • У вас есть две разные переменные с именем input, одна в области файлов, другая в main.
person Jens Gustedt    schedule 22.01.2014

Довольно простой:

#include <ctype.h>

/**
 * Will return true if there's at least one alpha character in 
 * the input string *and* all alpha characters are uppercase.
 */
int allUpper( const char *str )
{
  int foundAlpha = 0;                   
  int upper = 1;

  for ( const char *p = str; *p; p++ )
  {
    int alpha = isalpha( *p );           
    foundAlpha = foundAlpha || alpha;    
    if ( alpha )
      upper = upper && isupper( *p );    
  } 

  return foundAlpha && upper; 
}
person John Bode    schedule 22.01.2014