在C语言中,我怎样才能不使用大量的If语句而只检查ASCII定义的字母数组?

7d7tgy0s  于 2022-12-29  发布在  其他
关注(0)|答案(3)|浏览(84)

我试图确保在命令行输入的数组只有字母,大写和小写。
如果是数字或者其他什么,那么我想结束这个程序。
现在,我知道我可以用大量的if语句来完成这个任务:
如果它介于这和那之间
别的什么
还有这个那个。
但是我想尝试学习一种更有效的方法来做这个,因为我确信有一个for循环,我只是还没弄明白,我问是因为我想让用户输入一个长度为x的键,为了达到所需的字符串长度,我使用了一个类似的方法,多个if else语句。

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

int validate_key(int argc, string argv[]);

int main(int argc, string argv[])
{
    string input;
    int score;

    score = validate_key(argc, argv);

    if (score == 0)
    {
       // if required key is valid, next function of program here

       
    }

}

int validate_key(int argc, string argv[])
{

    //KEY VALIDATION 
    int l = 0; //initialize length variable
    string s;

    //To make sure that the string entered at command line is the required 26 characters, 
   //and that it isnt empty

    if (argc == 2) //make sure there are no spaces in the entered string
    {
        s = argv[1];     //assign key to string s
        l = strlen(s);   //check length of KEY

    }

    //check to see string isnt NULL / empty
    if (argc !=0 && l == 26) 
    {

        //make a for loop that scans the array making sure it is between two values? 
       //attempting to check argv to make sure it is a lowercase and or uppercase string 

         for (int i = 0; i < l; i++)
            {
                int charValue = argv[1][i];

                if ( ( charValue > 64 && charValue < 91 ) || ( charValue > 96 && charValue < 123 ) )
                {

                    printf("%c\n", charValue); //to show me that it made it into the if statement
                }
                else

                return 1;
            }

        return 0;

    }
    else if (l <= 25 && l >= 1) //entered key is too small
    {
        printf("Please Enter 26 Letter Key \n");
        printf("value of l: %d\n", l);

        return 1;
    }

    else //entered key is empty
    {
       //printf("value of l: %d\n", l);

        printf("missing command-line argument\n");

        return 1;

    }

}
zzzyeukh

zzzyeukh1#

使用isalpha()

    • 7.4.1.2 isalpha函数**
    • 概要**
#include <ctype.h>
      int isalpha(int c);
    • 说明**

isalpha函数用于测试isupper或islower为true的任何字符,或者测试iscntrl、isdigit、ispunct或isspace均不为true的特定于区域设置的字母字符集的任何字符。200)在"C"区域设置中,isalpha仅对isupper或islower为true的字符返回true。
在您的代码中:

for (int i = 0; i < l; i++)
        {
            // see notes below regarding the cast
            int charValue = ( unsigned char ) argv[1][i];

            if ( isalpha( charValue ) )
            {

                printf("%c\n", charValue); //to show me that it made it into the if statement
            }
            else

            return 1;
        }

但是请注意,传递的值必须可以表示为unsigned char
The header <ctype.h> declares several functions useful for classifying and mapping characters. In all cases the argument is an int, the value of which shall be representable as an unsigned char or shall equal the value of the macro EOF. If the argument has any other value, the behavior is undefined.

qmb5sa22

qmb5sa222#

基本的操作将始终是迭代输入字符串中的字符,并检查它们是否是您想要的那样:大写或小写字母。有一些函数可以让你更方便地编码。
为了避免自己编写ASCII数字范围,可以使用C标准函数isalpha()检查单个字符是否为字母。
还可以使用strcspn函数查找字符串开头的匹配字符数。匹配集可以是包含所有ASCII字母的字符串。如果返回的长度是整个字符串的长度,则表示其中没有其他字符。如果返回的长度小于字符串的长度,则存在一个非字母字符...这可能会降低计算机的效率,因为strcspn不仅检查字符是否在某个范围内,而且检查字符是否出现在匹配的字符串中。

bvjxkvbb

bvjxkvbb3#

具体的问题是关于非字母字符的测试。
已经有两个高质量的答案将您推荐到isalpha()

  • meta-* 问题是"我怎样才能写更少的代码?"

下面(使用isalpha())是一个教学示例,其功能与上面的OP代码相同。通过将代码压缩到更少的行,读者可以在不滚动的情况下浏览其操作。inputs等未使用的变量可以快速找到并删除。

#include <stdio.h>
#include <string.h>
#include <cs50.h> // Missing from OP code

// defining the function ahead of its use. Definition is its own prototype.
int unique26( string arg ) {
    int i = 0;
    // test all alpha and is exactly 26 chars long
    while( isalpha( (unsigned char) arg[i] ) i++;
    if( i != 26 || arg[i] )
        return 0; // bad

    // test no duplications in the sample
    for( i = 0; arg[i]; i++ )
        for( int j = i + 1; arg[j]; j++ )
            if( arg[j] == arg[i] )
                return 0; // bad

    return 1; // good
}

int main( int argc, string argv[] )
{
    if( argc != 2 || !unique26( argv[1] ) )
    {
        printf( "Usage: %s <key (26 unique alphabetic chars> \n", argv[0] );
        return 1;
    }

    // more code here

    return 0;
}

我很乐意回答这个示例代码的任何问题。

    • 编辑:**

为了编写更少的代码,函数unique26()可以使用strchr(),这是一个经过测试和验证的函数,来自所谓的"C字符串库"。

int unique26( string arg ) {
    int i = 0;
    while( isalpha( (unsigned char) arg[i] ) i++;
    if( i != 26 || arg[i] )
        return 0; // bad

    // test no duplications in the sample
    for( i = 1; arg[i] && strchr( &arg[i], arg[i-1] ) == NULL; i++ ) {}
    return arg[i] == '\0;
}

了解库函数是很好的,即使在了解之前您可能不会用到某些函数。

相关问题