我实际上是在尝试编写一些程序,以检查两个字符串是否相互置换。我解释 :

如果我考虑:

Eagle


Hdjoh

(我在上一个问题中使用了这两个示例)。

我得到一个排列,并且排列参数为3。为什么?因为在字母中:E + 3 = H,a + 3 = d等。

我使用了 unsigned char ,因为如果我在一个字符串中得到一个z,我希望(例如)z + 3 = c。

我开始做的是:
#include <stdio.h>
#define N 20

int my_strlen(unsigned char *string){
    int length;
    for (length = 0; *string != '\0'; string++){
        length++;
    }
    return(length);
}

int main()
{
    unsigned char string1[N], string2[N];
    int test=0, i=0, length1, length2;
    scanf("%s", string1);
    scanf("%s", string2);

    length1=my_strlen(string1);
    length2=my_strlen(string2);

    if(length1==length2){
        for(i=0; i<length1; i++){
            if(string1[i]==string2[i]){
                test=1;
                }
                else{
                    test=0;
                }
        }
        printf("Test = %d", test);
    }
    else{
        printf("Error");
    }

    return 0;
}

我才开始考虑它。.因此,目前,我只是尝试逐字母比较两个字符串。

这里的问题:如果我尝试比较你好你好,或者你好 Helqo 我得到了测试= 1。

所以有人可以告诉我这里有什么问题吗?

非常感谢。

编辑1:
#include <stdio.h>
#define N 20

int my_strlen(unsigned char *string){
    int length;
    for (length = 0; *string != '\0'; string++){
        length++;
    }
    return(length);
}

int main()
{
    unsigned char string1[N], string2[N];
    int test=0, i=0, length1, length2;
    scanf("%s", string1);
    scanf("%s", string2);

    length1=my_strlen(string1);
    length2=my_strlen(string2);

    if(length1==length2){
        for(i=0; i<length1; i++){
            if(string1[i]==string2[i]){
                test=1;
                }
                else{
                    test=0;
                    break;
                }
        }
        printf("Test = %d", test);
    }
    else{
        printf("Error");
    }

    return 0;
}

现在是正确的。我将会继续。

编辑2-6.7.14:

我实际上正在工作,并且是程序的“第二部分”。我正在寻找d,并验证其是否为置换。没那么容易,所以我需要一些建议,我是否必须编写其他函数来做到这一点?或者只是在我的代码的这一部分上工作:
if(length1==length2){
            for(i=0; i<length1; i++){
                if(string1[i]==string2[i]){
                    test=1;
                    }
                    else{
                        test=0;
                        break;
                    }
            }
            printf("Test = %d", test);
        }
        else{
            printf("Error");
        }

        return 0;
    }

我现在这样写:
if(length1==length2){
        for(i=0; i<length1; i++){
                for(d=0; d<255; d++){
                    if(string1[i]==string2[i] + d){
                        permutation=1;
                }
                else{
                    permutation=0;
                    break;
                }
                }
        }
        printf("\nPermutation = %d \nd = %d", permutation, d);
    }
    else{
        printf("Not a permutation");
    }

    return 0;
}

(我知道这是行不通的,但我只是尝试了..)。

预先感谢您的帮助。

最佳答案

您可以考虑这样的问题。为了使两个字符串成为有效排列,
字符串中每个字符的字符距离必须等于
因此,您可以检查第一个字符的距离,然后遍历其他字符
并确认距离相同。只要不等于第一个字符距离,您就可以安全地得出结论,它不是一个排列。

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

int main(void)
{
    int i;
    unsigned char string1[] = "test";
    unsigned char string2[] = "vguv";

    int slength1 = 4;
    int slength2 = 4;

    int distance;
    int is_permutation = 1;

    if (slength1 != slength2) {
        is_permutation = 0;
    }

    distance = (int)string2[0] - (int)string1[0];

    for (i=1; i<slength1; ++i) {
        if ( ((int)string2[i] - (int)string1[i]) != distance ) {
            is_permutation = 0;
            break;
        }
    }

    if (is_permutation) {
        printf("%s is a permutation of %s with distance %d\n", string1, string2, distance);
    } else {
        printf("%s is not a permutation of %s\n", string1, string2);
    }

    return EXIT_SUCCESS;
}

请注意,我使用了静态定义的字符串和字符串长度。您在用户输入中的原始阅读方式容易出现不确定的行为。您声明一个固定长度的字符串(在OP中为20),因此,如果用户输入的字符串长于19,则scanf将超出范围并调用未定义的行为。这非常糟糕,您应该仔细阅读。

09-11 17:57
查看更多