簡體   English   中英

有人能解釋一下為什么我不能使用 ASCII 值檢查字符串中的特殊字符嗎?

[英]Can someone explain me why I am not able to check special characters in my string using ASCII values?

因此,當我使用 function 通過顯式給出符號來檢查字符串中的特殊字符時,我的代碼實際上工作得很好:

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;
}

編輯:我已經包含了變量聲明並替換了我使用符號檢查特殊字符的代碼。 謝謝你。

EDIT2:這些是我要查找的字符::',','@','#','$','%','^','('. or ')'。 不是空格。

您的 function 的主要問題是您的for循環在每個循環周期后返回,因此您永遠不會檢查超過第一個循環。
您應該將return 0語句移動到 function 的末尾,然后它將按預期工作。

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

你的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; } }

在第一個循環中,您的 function 返回10 如果循環完成但沒有找到您要查找的字符,您只想返回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;
}

我不會嘗試編寫您的代碼...

if( isSpecialCharacter()

相當於:

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

(除了后者已被證明有效......)

如果a、b、q、m、z出現在字符串中,那么if條件為真...

學習標准庫,而不是花時間嚴重地重新發明它......

編輯:

既然您已經解碼了十進制 ASCII 值,那么經驗豐富的程序員可能會如何編寫該功能。 (不要指望下一個閱讀您的代碼的程序員會找到他們的 ASCII 表......)

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

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

注意:如果您需要在字符串中設置\"特殊字符,則必須使用“額外”反斜杠“轉義”這些字符中的任何一個。例如:

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

如果這看起來太像“壞語言”,您可以構建自己的字符串(確保它是 null 終止的。)

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

和...

char str[30][30];

/* Skipping ahead */

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

簡直是自找麻煩……

“返回 0”的 position 不正確。 它應該在“for循環”結束之后出現

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM