C语言字母数字检查坏字符

问题描述

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

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h> 
#include <stdint.h>

int isAlphaNum(char *str) {
    for (int i = 0; str[i] != '\0'; 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] != '\0'; i++)
    if (!isalnum(str[i]))

我使用了@chqrlie 的函数并且工作: 已编辑

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

if (isAlphaNum(userinput)) {
    printf(" success ;) \n");
}

现在一切都好 感谢帮助

解决方法

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

函数应该这样写:

#include <ctype.h> 

int isAlphaNum(const char *str) {
    while (*str) {
        if (!isalnum((unsigned char)*str++))
            return 0;
    }
    return 1;
}

您关于通过套接字接收输入的评论提示我怀疑您不是以空值终止通过套接字接收的字符串。如果在内存映射区域(以前称为在古老的 Multics 系统中)。