我是一个正在做家庭作业的大学生。我不一定要找一个直接的答案来回答我的问题,而是朝着正确的方向前进。所以这是我的问题。我必须编写一个C程序,它接受两个命令行参数,一个是包含单词列表的文件,另一个是单个单词。我之所以在引号中使用anagram这个词是因为它不是一个真正的anagram。
以下是问题要求:
我需要从命令行(dog)获取这个单词,并将其与字典列表(doggie)进行比较。如果命令行单词中的字母存在,那么我需要输出像You can't spell "doggie" without "dog"!这样的消息,所以我只是检查命令行参数中的字母是否存在于字典文件中的单词中。
以下是我目前掌握的情况:

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

#define MAX_WORD_LENGTH 80

int anagram(char a[], char b[]);

int main(int argc, char *argv[]) {
    if (argc != 3) {
        fprintf(stderr, "Usage: %s <list> <goal>\n", argv[0]);
        return -1;
    }
    FILE *file = fopen(argv[1], "r");

    if (file == 0) {
        fprintf(stderr, "%s: failed to open %s\n", argv[0], argv[1]);
    } else {
        char cmdLn[MAX_WORD_LENGTH], comp[MAX_WORD_LENGTH];
        strcpy(cmdLn, argv[2]);
        while (fgets(comp, sizeof comp, file) != NULL) {
            strtok(comp, "\n");
            int flag = anagram(cmdLn, comp);
            if (flag == 1) {
                printf("You can't spell \"%s\" without \"%s\".\n", cmdLn, comp);
            } else {
                printf("There's no \"%s\" in \"%s\".\n", cmdLn, comp);
            }
        }
        fclose(file);
    }
    return 0;
}

int anagram(char a[], char b[]) {

    return 1;
}

因此,我需要找出一种算法,将命令行单词的每个字符与字典文件中单词的每个字符进行比较。如果我从anagram函数中找到每个字母I,则返回1,否则返回0。我就是想不出怎么解决这个问题。任何帮助都将不胜感激。
编辑:为了澄清,我可以假设字典文件和命令行中的所有字母都是小写的。每个单词不能超过80个字符,并且单词中不会有数字。

最佳答案

一种典型的高级语言方法是使用字母的集合或散列。但让我们简单一点:
复制命令行单词。
循环浏览文件单词中的字母:
将复写词中的字母循环:
如果每个字母都匹配,请在复制词中删除该字母(例如,将其更改为*)
在循环之后,如果复制单词的所有字母都消失了(即。
星星),这是一场比赛

int anagram(char *a, char *b) {

    size_t counter = 0, a_len = strlen(a), b_len = strlen(b);

    char *c = strdup(a);

    for (int j = 0; j < b_len; j++) {
        for (int i = 0; i < a_len; i++) {
            if (c[i] == b[j]) {
                c[i] = '*';
                counter++;
                break;
            }
        }
    }

    free(c);

    return (counter == a_len);
}

你需要修正上面的问题来忽略这个案子。

关于c - 用C语言编写的“Anagram”程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36580598/

10-11 02:11