c - 确定两个字符串是否是字谜?

标签 c

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

static int comp(const void *a, const void *b);

int main(int argc, char ** argv)
{
    char s1[]="";
    char s2[]="";
    char *fmt = "%[^\n]%*c";

    printf("Enter the first word? ");
    scanf(fmt,&s1);

    printf("Enter the second word? ");
    scanf(fmt,&s2);

    qsort(s1, strlen(s1), 1, comp);
    qsort(s2, strlen(s2), 1, comp);

    printf("%s : %s  - %s\n", s1, s2, strcmp(s1, s2) ? "No" : "Yes");
    return 0;
}

static int comp(const void *a, const void *b)
{
    const char *pa = (char*)a;
    const char *pb = (char*)b;

    return
        (*pa > *pb) ?  1 :
        (*pa < *pb) ? -1 :
        0;
}

当我键入“smartest”作为我的第一个字符串并键入“mattress”作为我的第二个字符串时,我的输出变为

emrsstt : aemrsstt - No 

为什么字符串的第一个字符丢失?

我已经在这上面坐了好几个小时了。如果有人能指出我可能犯的愚蠢错误,我将不胜感激。

最佳答案

一个聪明的方法是首先检查可能的字谜。您可以通过

执行此操作
  1. 比较字符串长度。

  2. 对总集合中的每个字符进行异或;从两个字符串中提取。

如果 (2) 的结果不为零,则字符串不可能是字谜词。这样做的优点是 (2) 在 c 中速度非常快,而且大多数字符串都不是字谜,即使它们长度相同。如果您感觉特别雄心勃勃,您可以将 (1) 和 (2) 组合成一个 O(N) 算法!

完成后,调用您的主代码体。您的问题是不允许每个字符串上有 null 终止符。您需要为字符串字符分配足够的空间,并为空终止符分配一个额外的元素。

关于c - 确定两个字符串是否是字谜?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26912871/

相关文章:

c - 在 C 程序中使用汇编语言的目的是什么?

c - 运行时检查失败#2 : Stack around the variable 'power' was corrupted

c - 为什么不应该在 linux 内核中将全局变量初始化为 0/NULL/false?

C可以在编译时排序吗?

c - 程序执行时停止(文件处理)

c - linux 中对 pthread_create 的 undefined reference (c 编程)

c - 双向链表在函数后插入

c - 使用c套接字传输音频文件

c - 与 C 的蛇游戏

c# - 如何从 native C .dll 导出结构定义以在 C# 中使用