为什么我无法使用 ASCII 值检查字符串中的特殊字符?

问题描述 投票:0回答:4

当我使用通过显式给出符号来检查字符串中的特殊字符的函数时,我的代码实际上运行得很好:

int isSpecialCharacter(char str[], int n)
{
    for(int i=0; i<n;i++)
    {
        if (str[i] == '!' || str[i] == '@' || str[i] == '#' || str[i] == '$' || str[i] == '%' || str[i] == '^' || str[i] == '(' || str[i] == ')')
        {
            return 1;
        } 
        return 0;
    }
}

但是,在下面的代码中,我无法让我的代码使用 ASCII 值查找字符串中的特殊字符。我想了解我做错了什么。在下面的代码中,我还包含了我的

main()
,提示用户输入字符串。

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

char str[30][30];
char test[100];
int myindex = 0;

int isSpecialCharacter(char str[], int n)
{
    for(int i=0; i<n;i++)
    {
        if (str[i] == 33 || str[i] == 35 || str[i] == 36 || str[i] == 37 || str[i] == 40 || str[i] == 41 || str[i] == 64)
        {
            return 1;
        } 
        return 0;
    }
}

int main()
{
    printf("Please enter 10 strings below: \n");
    while(myindex < 10)
    {
        printf("Enter string %d: ", myindex+1);
        fgets(str[myindex], 500, stdin);
        strcpy(test, str[myindex]);
        int t_size = strlen(test);

        if (strlen(str[myindex])<2||strlen(str[myindex])>26)
        {
            printf("Enter string that is between 2 and 25");
            continue;

        }
        else if(isSpecialCharacter(test, t_size) == 1)
        {
            printf("Your string has some special characters. \n");
            continue;
        }
        else
        {
            myindex++;
        }
    }
    return 0;
}

编辑: 我已经包含了变量声明并替换了使用符号检查特殊字符的代码。谢谢你。

编辑2: 这些是我想要查找的字符::'!'、'@'、'#'、'$'、'%'、'^'、'(' 或 ')'。 没有空格。

c ascii
4个回答
2
投票

您的两个函数都无法按照您编写的方式运行。

主要问题是

for
循环在每个循环周期后返回,因此您永远不会检查第一个周期之后的情况。
您应该将
return 0
语句移至函数末尾,然后它将按预期工作。

int isSpecialCharacter(char str[], int n)
{
    for (int i = 0; i < n; i++)
    {
        if (str[i] == 33 || str[i] == 35 || str[i] == 36 || str[i] == 37 || str[i] == 40 || str[i] == 41 || str[i] == 64)
        {
            return 1;
        }
    }
    return 0;
}

测试

我已经使用以下输入测试了该解决方案:

test1
test2
test)
test(
test3
test4
test5
test@
test6
test7
test!
test8
test9
test10

而且它有效。您可以在那里看到结果:https://godbolt.org/z/67Px14z75


正如评论部分中其他用户的建议,使用十进制值来引用字符是一种不好的做法™,您应该坚持使用

'@'
表示法。


2
投票

您的

return 0;
不正确:

int isSpecialCharacter(char str[], int n) {
    for(int i=0; i<n;i++)
    {
        if (str[i] == '!' || str[i] == '@' || str[i] == '#' || str[i] == '$' || str[i] == '%' || str[i] == '^' || str[i] == '(' || str[i] == ')')
        {
            return 1;
        } 
        return 0;
    } 
} 

在第一个循环中,您的函数返回

1
0
。如果循环完成而没有找到您要查找的字符,您只想返回
0
(false)。

int isSpecialCharacter(char str[], int n)
{
    for(int i=0; i<n;i++)
    {
        if (str[i] == '!' || str[i] == '@' || str[i] == '#' || str[i] == '$' || str[i] == '%' || str[i] == '^' || str[i] == '(' || str[i] == ')')
        {
            return 1;
        } 
    }
 
    return 0;
}

1
投票
  • 其他人注意到函数中
    return 0;
    的位置不正确。
  • 使用全局变量不是必需的,并且可能会导致混乱。
  • 正确:
    int main( void )
    ;错误:
    int main()

深入挖掘:

char str[30][30];

/* Skipping ahead */

printf("Enter string %d: ", myindex+1);
fgets(str[myindex], 500, stdin);

不是有效的 C 程序。该代码展示了 UB。

不要在代码中使用(不正确的)“幻数”。


我不会尝试编写你的代码...

if( isSpecialCharacter() )

相当于:

if( strpbrk( test, "abqmz" ) != NULL )

(除了后者已被证明有效...)
如果字符串中出现

'a'
'b'
'q'
'm'
'z'
,则
if
条件为真。

学习标准库,而不是花时间重新发明它。

旁白:你的函数名称应该是

hasSpecialChars()
,因为它扫描一个字符串。它不仅仅测试单个字符。


既然您已经解码了十进制 ASCII 值,那么经验丰富的程序员可能会如何编写该功能。 (不要指望读者必须通过打印的 ASCII 表来解码您的代码。将这个练习留给Mark Watney之类的人。)

char spcl[] = "!@#$%^()";

if( strpbrk( test, spcl ) != NULL ) {
     /* Do something because condition is true */

如果您需要在字符串中使

\
"
变得特殊,则必须使用额外的反斜杠来 转义 这些字符。例如:

char spcl[] = "\\!@#$%^(\")"; // notice '\\' and '\""

如果这看起来太像“糟糕的语言”,您可以构造自己的字符串(确保(!)它以 null 结尾。)

char spcl[] = { '\\', '!', '@', '#', '$', '%', '^', '(', '\"', ')', '\0' };


故事的寓意:在字符串中搜索某个字符或一组字符中的一个是一种常见操作。花在“自己开发”上的时间应该花在学习和使用标准库的经过验证的函数套件上。这个问题及其几个答案是不需要的。


0
投票

“return 0”位置不正确。 它应该在“for循环”结束之后出现

© www.soinside.com 2019 - 2024. All rights reserved.