【问题标题】:Testing to see if a string only contains alphabetic numbers测试一个字符串是否只包含字母数字
【发布时间】:2017-02-27 17:45:52
【问题描述】:

我正在学习 C,但我一直在尝试创建一个程序。基本上我正在测试一个字符串是否只包含字母字符a-zA-Z

我做了什么:

  1. 定义了一个名为 strisalpha 的函数来执行此操作
  2. 在我的“测试台”中调用该函数,要求用户输入一个字符串

gcc 编译器出了什么问题:

testBench1.c:21:28: warning: implicit declaration of function 'atoi' [-Wimplicit-function-declaration]
     integerCharValue = atoi( string[loopPointer1] );

这是我对strisalpha的定义:

int strisalpha(char *string)
{
    int stringLength = 0;
    int loopPointer1 = 0;
    int integerCharValue = 0;
    int dummyArgument = 0;

    /* Get length of string */
    stringLength = strlen (string);
    printf("\nString length is: %d", stringLength);

    /* ASCII Codes In Decimal */
       A (65Decimal) to Z(90Decimal) and
       a (97Decimal) to z (122Decimal)

    Set up a loop and query if ASCII alphabetic character
    */
    for (loopPointer1 = 1; loopPointer1 > stringLength; loopPointer1++ )
    {

    /* Convert character to integer */
    integerCharValue = atoi( string[loopPointer1] );
    printf ("%d \n", integerCharValue);
    if (integerCharValue >= 65)
        if (integerCharValue <= 90)
        return 1;  /* Upper case alphabetic character, so OK */
        else if (integerCharValue >= 97)
            if (integerCharValue <= 122)
            return 1; /* Lower case alphabetic character, so OK */
            else

结果总是显示我输入了一个 ASCII 字符,即使我没有输入。请有人能说明我做错了什么吗?谢谢

【问题讨论】:

  • 1) loopPointer1 = 1; loopPointer1 &gt; stringLength; --> loopPointer1 = 0; loopPointer1 &lt; stringLength; 2) integerCharValue = atoi( string[loopPointer1] ); --> integerCharValue = string[loopPointer1];
  • 什么是“字母数字”??
  • “gcc 编译器出了什么问题” - 不是编译器编写了强烈反对的代码。
  • 感谢 Olaf 澄清这一点。

标签: c type-conversion ascii


【解决方案1】:

主要问题是你的 for 循环

for (loopPointer1 = 1; loopPointer1 > stringLength; loopPointer1++ )

C 中的数组从 0 开始,中间部分定义循环是否应该继续而不结束。所以你想要的是:

for (loopPointer1 = 0; loopPointer1 < stringLength; loopPointer1++ )

然后为了检查每个字符,你不需要对它们做任何事情,因为你可以比较像这样的字符

if (string[loopPointer] >= 'A')

【讨论】:

  • 感谢您的回复,克里斯。
  • 我注意到您使用的最后一行 >= 'A'。在这个程序中 >= 相对于 == 有什么意义?会不会只是 ==?
  • 它和你的if (integerCharValue &gt;= 65) 做同样的事情——如果我输入==,那么它只会在你想要“A”或后面的字符时匹配“A”使用&gt;= 可以获得什么
【解决方案2】:

atoi 不是你想在这里使用的。 chars 已存储为数字 ASCII 值。你可以设置integerCharValue = string[loopPointer1]

您的loopPointer1 从 1 开始,因此您将跳过字符串中的第一个字符。在 C 中,索引从 0 开始。

另外,如果您找到一封信,您不会想立即返回。调用 return 将退出函数并停止循环。您可能想要做的是寻找不是字母的字符,如果找到了return 0。然后,如果你到达循环的末尾,你可以return 1,因为你知道你没有找到任何不是字母的字符。

【讨论】:

    【解决方案3】:

    这是一个单行函数,如果字符串仅包含字母字符,则计算结果为 1,否则计算结果为 0

    #include <string.h>
    
    int strisalpha(const char *str) {
        return str[strspn(str, "abcdefghijklmnopqrstuvwxyz"
                               "ABCDEFGHIJKLMNOPQRSTUVWXYZ")] == '\0';
    }
    

    这是一个更经典的方法isalpha()

    #include <ctype.h>
    
    int strisalpha(const char *str) {
        while (*str) {
            if (!isalpha((unsigned char)*str++)
                return 0;
        }
        return 1;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 2011-07-11
      • 2013-11-26
      • 1970-01-01
      • 2014-06-18
      • 2012-03-10
      • 1970-01-01
      相关资源
      最近更新 更多