C 函数仅允许字母、连字符和撇号

C 函数仅允许字母、连字符和撇号,c,C,如上所述,我想创建一个函数来检查字符串中的所有字符是否包含任何禁止输入。条件是我只接受字母、连字符和撇号。下面是我的代码,它的工作方式与我预期的不同。如果它不是字母表,也不是撇号或连字符,我想将结果更改为0。但是,当我输入一个有效的输入,如“a-a;如果是字母表或连字符,则仍会执行if函数,并打印“它不被接受” #包括 #包括 #包括 #包括 int validateInput(字符字[]); 内部主(空){ 字符字[33]=“a-a”; printf(“%d”,validateInput(wo

如上所述,我想创建一个函数来检查字符串中的所有字符是否包含任何禁止输入。条件是我只接受字母、连字符和撇号。下面是我的代码,它的工作方式与我预期的不同。如果它不是字母表,也不是撇号或连字符,我想将结果更改为0。但是,当我输入一个有效的输入,如“a-a;如果是字母表或连字符,则仍会执行if函数,并打印“它不被接受”

#包括
#包括
#包括
#包括
int validateInput(字符字[]);
内部主(空){
字符字[33]=“a-a”;
printf(“%d”,validateInput(word));
}
int validateInput(字符字[]){
int结果=1;
int i;
int长度=strlen(字);
对于(i=0;i尝试:


您的代码中存在多个问题:

  • 您在每次迭代时而不是在循环结束时发出诊断
  • 测试
    (单词[i]!='-')|(单词[i]!='\'''\'')
    总是正确的
  • isalpha()
    不应传递可能为负值的
    char
    值。应将参数强制转换为
    (无符号char)
    ,以避免潜在的未定义行为
以下是修改后的版本:

#include <ctype.h>

int validateInput(const char *word) {
    int result = 1;
    for (size_t i = 0; word[i] != '\0'; i++) {
        if (!isalpha((unsigned char)word[i]) && word[i] != '-' && word[i] != '\'') {
            result = 0;
            break;
        }
    }
    if (result) {
        printf("ACCEPTED\n");
    } else {
        printf("IT IS NOT ACCEPTED\n");
    }
    return result;
}
这是一个更详细的版本,使用了
strspn()
,适用于所有编码:

#include <string.h>

int validateInput(const char *word) {
    size_t len = strspn(word, "'-ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
    if (len > 0 && word[len] == '\0') {
        printf("ACCEPTED\n");
        return 1;
    } else {
        printf("IT IS NOT ACCEPTED\n");
        return 0;
    }
}
#包括
int validateInput(常量字符*字){
尺寸长度=strspn(单词“'-abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvxyz”);
如果(len>0&&word[len]=='\0'){
printf(“已接受的”);
返回1;
}否则{
printf(“不接受”\n);
返回0;
}
}

请问您的问题是什么?
isalpha(单词[i]==0)
??这应该做什么?哦,我的意思是isalpha(单词[i])==0。如果它不是字母表,也不是连字符或撇号,那么我会将结果更改为0。如果不是,结果将保持为1,告诉我这个单词[i]是字母表、连字符或撇号。我建议使用更简单的
if(isalpha(单词[I])==0&&word[I]!='-'&&word[I]!='\'')
谢谢,先生!现在我想起来了,你的方法更有意义,它帮助我的代码工作。但是,你知道条件语句有什么问题吗?函数采用
int
参数,而不是
char
参数。根据
如果参数不可表示为
无符号字符
且不等于值
EOF
,则会导致该错误。因此,应将其写入
isalpha((无符号字符)字[i])
#include <ctype.h>

int validateInput(const char *word) {
    int result = 1;
    for (size_t i = 0; word[i] != '\0'; i++) {
        if (!isalpha((unsigned char)word[i]) && word[i] != '-' && word[i] != '\'') {
            result = 0;
            break;
        }
    }
    if (result) {
        printf("ACCEPTED\n");
    } else {
        printf("IT IS NOT ACCEPTED\n");
    }
    return result;
}
#include <stdio.h>

int validateInput(const char *word) {
    int pos = 0;
    sscanf(word, "%*[-a-zA-Z']%n", &pos);
    if (pos > 0 && word[pos] == '\0') {
        printf("ACCEPTED\n");
        return 1;
    } else {
        printf("IT IS NOT ACCEPTED\n");
        return 0;
    }
}
#include <string.h>

int validateInput(const char *word) {
    size_t len = strspn(word, "'-ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
    if (len > 0 && word[len] == '\0') {
        printf("ACCEPTED\n");
        return 1;
    } else {
        printf("IT IS NOT ACCEPTED\n");
        return 0;
    }
}