C语言字母数字检查是否存在错误字符



我有这个C代码可以完全工作:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h> 
#include <stdint.h>
int isAlphaNum(char *str) {
for (int i = 0; str[i] != ''; i++)
if (!isalnum(str[i]))
return 0;
return 1;
}
int main() {
char *user_string = "abcdedf0123456789ABCD";
if (isAlphaNum(user_string)) {
printf(" is valid n");
} else {
printf(" is not valid n");
}
printf(" n end n");
return 0;
}

以下是从终端复制的:

但是当我通过这样的插座接收输入时:

90a41ae8477a334ba609e06cujdikj#%&%$@$Dkdfsノ,ᅵハ"]￘モ {ᆳf

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒814

程序崩溃在这个部分:

for (int i = 0; str[i] != ''; i++)
if (!isalnum(str[i]))

我使用了@chqrlie的函数,工作如下:编辑

int isAlphaNum(const char *str) {
//this message is printed , then craches
printf("pass isAlphaNum userinput = %sn" , str);
while (*str) {
if (!isalnum((unsigned char)*str++))
return 0;
}
return 1;
}
if (isAlphaNum(userinput)) {
printf(" success ;) n");
}

现在一切都好感谢的帮助

您的代码中存在问题,但它不太可能在GNU/linux系统上引起问题,但在其他系统上可能会引起问题:如果str[i]具有负值,则isalnum(str[i])具有未定义的行为,如果字符串包含8位字节,并且默认情况下对char类型进行了签名,则这是可能的。CCD_ 4应该仅被传递类型为unsigned char或特殊负值EOF的值。

函数应该这样写:

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

您关于通过socket接收输入的备注提示我怀疑您不是null,终止了通过socket接收的字符串。如果在内存映射区域(在古代Multics系统中曾被称为(的末尾之前没有空字节,这可能会导致isAlphaNum()读取超出阵列的末尾,并导致分段故障。

相关内容

  • 没有找到相关文章

最新更新