首页 > 解决方案 > 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");
}

现在一切都好,感谢您的帮助

标签: ccharclangundefined-behavior

解决方案


您的代码中存在问题,但不太可能在 GNU/linux 系统上导致问题,但可能在其他系统上:如果具有负值,isalnum(str[i])则具有未定义的行为,如果字符串包含 8 位字节并且类型默认签名。应该只传递类型的值或特殊的负值。str[i]charisalnum()unsigned charEOF

函数应该这样写:

#include <ctype.h> 

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

您关于通过套接字接收输入的评论提示我怀疑您不是 null 终止通过套接字接收的字符串。如果在内存映射区域(过去在古代 Multics 系统中称为isAlphaNum())结束之前没有空字节,这可能会导致读取超出数组的末尾并导致分段错误。


推荐阅读