![](/img/trans.png)
[英]Can someone explain me why I am getting two different answers for the below codes?
[英]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 返回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;
}
我不會嘗試編寫您的代碼...
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.