用An写的“Anagram”程序

时间:2016-04-12 17:50:24

标签: c anagram

完全披露我是一名从事家庭作业的大学生。我不一定在寻找我的问题的直接答案,而是更多地朝着正确的方向努力。所以这是我的问题。我必须编写一个C程序,它接受2个命令行参数,一个是包含单词列表的文件,另一个是单个单词。现在我在引号中使用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函数中找到每个字母,我会返回1,如果我不返回0.我根本无法弄清楚如何处理这个问题。任何帮助将不胜感激。

编辑:为了澄清,我可以假设字典文件和命令行中的所有字母都是小写。此外,每个单词不得超过80个字符,单词中不会有数字。

2 个答案:

答案 0 :(得分:1)

典型的,更高级别的语言方法是使用字母的集合或散列。但是让我们保持简单:

  

复制命令行字。

     

循环文件中的字母:       循环复制词中的字母:           如果每封信件匹配,则在复制词中删除该字母(例如将其更改为*)

     

循环之后,如果复制词的所有字母都消失了(即   明星),这是一场比赛

json_encode()

你需要修改上述内容以忽略大小写。

答案 1 :(得分:0)

从文件中读取单词
使用int作为标志 - 将其设置为1(表示测试单词中的所有字母都出现在文件中的单词中) 循环测试单词,一次取一个字母 - 记住一个字符串可以作为一个字符数组访问。

使用strchr测试该字母是否出现在从文件中读取的单词中 如果没有出现(查看strchr返回的内容未找到),将标志更改为0并退出比较循环

根据标志值打印消息 - 如果标志仍为1,则所有字母都存在,否则至少有一个字母不存在。

    /* set flag to 'letters all present' */
    int flag = 1;
    /* test word from file for each letter in test word */
    for (n = 0; n < strlen(word);  n++) {
        if(strchr(line, word[n]) == NULL) {
            /* set flag to letter not present */
            flag = 0;
            break;
        }
    }