【问题标题】:C - How to check if unwanted character is in an array?C - 如何检查不需要的字符是否在数组中?
【发布时间】:2017-03-02 17:40:51
【问题描述】:

我有一个关于字符串数组的问题。

我正在尝试寻找一种方法来检查字符串中是否包含不需要的字符。

测试数组必须只包含以下 8 个选项之一:{'A','a','C','c','G','g','T','t'}

在此检查过程之前删除所有空格。

如果我有两个数组 A = {AGctcgtacgtacg} B = {CGTAagctFcg}

A 应该通过测试,B 应该失败,因为其中包含“F”。

我正在考虑使用 for 循环遍历数组的每个元素并尝试检查字符是否是选项之一。

const char test[] = {'A','a','C','c','G','g','T','t'};
int l = strlen(A);
char A[] = {AGctcgtacgtacg} 
char B[] = {CGTAagctFcg}
for (i = 0; i < l; i++){
    if (A[i] is one of the characters in test){
        do nothing... (keep checking)
    }
    else{
    break;
    printf("Error: the array contains unwanted character.");
    exit(1);
    }
}

【问题讨论】:

    标签: c arrays string character


    【解决方案1】:

    您可以使用标头&lt;string.h&gt; 中声明的标准C 函数strspn 来检查字符串是否仅包含有效字符。

    例如

    #include <stdio.h>
    #include <string.h>
    
    int main( void )
    {
        const char *test = "AaCcGgTt";
        char A[] = "AGctcgtacgtacg";
        char B[] = "CGTAagctFcg";
    
        if (A[strspn(A, test)] == '\0')
        {
            puts("Array A has valid characters");
        }
        else
        {
            puts("Array A has invalid characters");
        }
    
        if (B[strspn(B, test)] == '\0')
        {
            puts("Array B has valid characters");
        }
        else
        {
            puts("Array B has invalid characters");
        }
    }
    

    程序输出是

    Array A has valid characters
    Array B has invalid characters
    

    如果你还需要知道第一个无效字符的位置,那么你可以写例如

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        const char *test = "AaCcGgTt";
        char A[] = "AGctcgtacgtacg";
        char B[] = "CGTAagctFcg";
        size_t n;
    
        if (A[n = strspn(A, test)] == '\0')
        {
            puts("Array A has valid characters");
        }
        else
        {
            puts("Array A has invalid characters");
            printf("Invalid character is %c at position %zu\n", A[n], n);
        }
    
        if (B[n = strspn(B, test)] == '\0')
        {
            puts("Array B has valid characters");
        }
        else
        {
            puts("Array B has invalid characters");
            printf("Invalid character is %c at position %zu\n", B[n], n);
        }
    }
    

    程序输出是

    Array A has valid characters
    Array B has invalid characters
    Invalid character is F at position 8
    

    【讨论】:

    • 谢谢,我不知道哪个更好用,strspn 或 strchar。它们似乎都有效。
    • @Paul 使用 strspn 您无需自己编写循环并使用 strlen 计算字符串长度
    • 嗯,对于char A[] = "";,我认为这是"Array A has valid characters"。仍然很好地使用strspn()
    • @chux 此检查可以在使用 strspn 之前完成,也可以包含在 A[0] != '\0' 等条件中
    【解决方案2】:

    尝试使用strchr(...) 注意测试需要以 NUL 终止

    const char test[] = {'A','a','C','c','G','g','T','t','\0'};
    int l = strlen(A);
    char A[] = {AGctcgtacgtacg} 
    char B[] = {CGTAagctFcg}  
    for (i = 0; i < l; i++){
        if (strchr(test, A[i])){
            do nothing... (keep checking)
        }
        else{
            break;
            printf("Error: the array contains unwanted character.");
            exit(1);
        }
    }
    

    【讨论】:

    • 非常感谢,我可以用吗?对于 if 语句行?就像如果测试通过了,我必须不做任何事情去下一个元素。
    • 编译时收到此消息。警告:函数“strchar”的隐式声明在 C99 中无效 [-Wimplicit-function-declaration]
    • 而不是const char test[] = {'A','a','C','c','G','g','T','t','\0'};。代码可以使用等效的const char test[] = "AaCcGgTt";,这也使test[] 大小为9,并带有一个空字符终止。
    • 建议更换char A[] = {AGctcgtacgtacg} --> char A[] = "AGctcgtacgtacg"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 2022-01-02
    相关资源
    最近更新 更多