c - 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])
则具有未定义的行为,如果字符串包含 8 位字节并且类型默认签名。应该只传递类型的值或特殊的负值。str[i]
char
isalnum()
unsigned char
EOF
函数应该这样写:
#include <ctype.h>
int isAlphaNum(const char *str) {
while (*str) {
if (!isalnum((unsigned char)*str++))
return 0;
}
return 1;
}
您关于通过套接字接收输入的评论提示我怀疑您不是 null 终止通过套接字接收的字符串。如果在内存映射区域(过去在古代 Multics 系统中称为段isAlphaNum()
)结束之前没有空字节,这可能会导致读取超出数组的末尾并导致分段错误。
推荐阅读
- python - 如何在渴望模式下获得设备放置?
- networking - 使用 IO::Socket::Async 设置 TCP 标志
- winapi - 我想在消息框中使用 YES 和 NO 两个按钮更改输出
- javascript - 单击复选框后如何在文本中添加一条线?
- bioinformatics - 使用 MaSuRCA 3.2.6 汇编程序的问题
- mysql - 计算跨列的不同值
- python - Python 请求 GET 与列表中的字符串
- spring-boot - 在 Spring Boot 之外关闭服务
- python - 在循环中连接数据帧
- c++ - 如果我在每个平台上使用相同的种子,随机结果会相同吗?