因此,当我使用通过显式给出符号来检查字符串中的特殊字符的函数时,我的代码实际上运行得很好:
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: 这些是我想要查找的字符::'!'、'@'、'#'、'$'、'%'、'^'、'(' 或 ')'。 没有空格。
您的两个函数都无法按照您编写的方式运行。
主要问题是
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
正如评论部分中其他用户的建议,使用十进制值来引用字符是一种不好的做法™,您应该坚持使用
'@'
表示法。
您的
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;
}
其他人注意到函数中
return 0;
的位置不正确。
深入挖掘:
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' };
“return 0”位置不正确。 它应该在“for循环”结束之后出现