首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Anagram项目

Anagram项目
EN

Stack Overflow用户
提问于 2014-12-04 06:14:32
回答 2查看 652关注 0票数 0

我很难得到"isZero“函数来检测单词是否是anagram。如果问"isZero“是否等于main()中的1,它只会给出"anagram”。如果我把它设为0,它只会给我“不是字谜”。对我来说,这不是计算任何东西,它只是打印出任何陈述是对的,目前。不知道如何解决这个问题,可能需要一些指导。

代码语言:javascript
复制
 #include <stdio.h>
 #include <ctype.h>

 #define MAX 26

void intialize(char a[], char b[], int c[]);
void setLetters(char newCount[], int newNumber[]);
void checkLetters(char b[], int newNumber[]);
int isZero(int c[]);
void getstring(char a[]);
void getString(char b[]);

int main(void)
{
    char a[MAX], b[MAX];
    int c[MAX];

    intialize( a, b, c);
    getstring(a);
    getString(b);
    setLetters(a, c);
    checkLetters(b, c);

    if (isZero(c) == 1) {
        printf("anagram");
    } else
        printf("not anagram");
    return 0;
}

void intialize(char a[], char b[], int c[])
{
    int i;
    for(i = 0; i < MAX; ++i) {

        a[i] = '\0';
        b[i] = '\0';
        c[i] = 0;
    }
}
void setLetters(char newCount[], int newNumber[])
{
    int i, index = 0;
    for(i = 0; i < MAX; ++i) {
        if(isalpha(newCount[i])) {
            newCount[i] = tolower(newCount[i]);
            index = (int)(newCount[i] - 'a');
            newNumber[index] +=1;
        }
    }
}
void checkLetters(char b[], int newNumber[])
{
    int i, index;
    for(i = 0; i < MAX; ++i) {
        if(isalpha(newNumber[i])) {
            newNumber[i] = tolower(newNumber[i]);
            index = (int)(newNumber[i] - 'a');
            newNumber[index] -= 1;
        }
    }
}
int isZero(int c[])
{
    int i, j = 0;
    for(i = 0; i < MAX; ++i) {
        if(c[i] == 0)
            j = 1;
        else
            return 0;
    }
    return j;
}
void getstring(char a[])
{
    char line[MAX];

    printf("Enter a string: ");
    gets(line);
}
void getString(char b[])
{
    char line[MAX];

    printf("Enter a string: ");
    gets(line);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-04 07:54:16

有了C,你必须放慢速度,了解每一行的每一部分都做些什么。C中没有足够接近的正确的的部分。话虽如此,你对如何处理这个问题有一个全面的想法。但是,很明显,您刚刚开始使用C语言(考虑到其他答案和评论)。

在开始编写函数之前,确定需要函数做什么。然后试着决定如何最好地处理这个任务。如果您需要一个函数来获取字符串输入,那么编写一个函数就可以了。如果您发现自己必须编写一个函数来填充每个字符串stop,那么您的函数就已经失败了。为a[]编写一个函数来做相同的事情,为b[]编写另一个相同的函数,这是没有意义的。您不需要一个函数来循环所有数组,将新声明的数组设置为zero/NULL,这就是数组初始化语法的目的。

在您期望函数工作之前,请花时间学习如何将值传递给(如果需要返回-从函数中获取值)。将数组传递给函数时,会发生指针衰减。这意味着数组a[]在传递给函数时会衰减到*a。您可以利用这一点,将您的函数声明为接受*a作为参数。虽然对于一个简单的1-D数组来说,这并不是令人震惊的事情,但是2-D阵列和更高级别的阵列会更多地涉及到衰减。

除了找出哪些代码作为函数是有意义的,您还需要对C语言中的逻辑和它的语法一样精确。如果您不确定行的任何部分,请查找它,查看正在使用的函数的手册页,或查阅编译器的语言引用(Gnu/MS)等,以确保您知道代码的确切功能。从长远来看,这会节省你的时间。让新C程序员兴奋的第一件事是尝试浏览手册浏览图书,然后开始编写代码。学习C的关键是放慢的速度。

gets(). 从不,从不,从来不使用如果你正在上一堂课,老师给你分配了一份作业,那就去行政管理部门并要求退款。gets()不再是标准C库的一部分,因为它很容易被破坏和利用。使用fgetsgetlinescanf (如果选择使用scanf 格式字符串,请阅读关于正确使用该格式字符串的整个章节)。这是一个很好的功能,但它有许多陷阱,只是等待一个人,部分理解它的使用。

话虽如此,你有一个整体的逻辑来处理字谜。下面,我提供了一个示例,说明了在整理您的代码时的上述要点。花点时间读一读,明白我为什么要做这些改变。此外,我还为输入的单词添加了一个快速的length检查。如果它们的长度不一样,就没有必要更进一步。如果你有问题请告诉我。这里有很多好人很乐意帮忙。

代码语言:javascript
复制
#include <stdio.h>
#include <ctype.h>
#include <string.h>

#define MAX 26

void setLetters(char *newCount, int *newNumber);
void checkLetters(char *newCount, int *newNumber);
int isZero (int *c);
void getstring (char *a);

int main (void)
{
    char a[MAX] = {0};  /* initialize all to zero/NULL */
    char b[MAX] = {0};
    int  c[MAX] = {0};

    getstring(a);
    getstring(b);
    printf ("\n You entered:\n\n  a: %s\n  b: %s\n\n", a, b);

    /* test lengths - if differ, not anagram */
    if (strlen(a) != strlen(b)) {
        printf (" Lenghts differ, cannot be an anagram.\n\n");
        return 1;
    }

    setLetters (a, c);      /* set key array  (c)   */
    checkLetters (b, c);    /* check key array (c)  */

    if (isZero(c))
        printf(" The words form an anagram.\n\n");
    else
        printf(" The words are not and anagram.\n\n");

    return 0;
}

void setLetters (char *newCount, int *newNumber)
{
    int i = 0;
    int index = 0;

    for (i = 0; i < MAX; ++i) {
        if (isalpha (newCount[i])) {
            newCount[i] = tolower (newCount[i]);
            index = (int)(newCount[i] - 'a');
            newNumber[index] +=1;
        }
    }
}

void checkLetters(char *newCount, int *newNumber)
{
    int i = 0;
    int index = 0;

    for (i = 0; i < MAX; ++i) {
        if (isalpha (newCount[i])) {
            newCount[i] = tolower (newCount[i]);
            index = (int)(newCount[i] - 'a');
            newNumber[index] -= 1;
        }
    }
}

int isZero (int *c)
{
    int i = 0;
    for (i = 0; i < MAX; ++i)
        if (c[i] == 1)
            return 0;

    return 1;
}

void getstring (char *a)
{
    printf ("\n Enter a string: ");
    scanf  ("%[^\n]%*c", a);
}

输出:

代码语言:javascript
复制
$ ./bin/anaproj

 Enter a string: yekcim

 Enter a string: mickey

 You entered:

  a: yekcim
  b: mickey

 The words form an anagram.

$ ./bin/anaproj

 Enter a string: yekcim

 Enter a string: mickez

 You entered:

  a: yekcim
  b: mickez

 The words are not and anagram.
票数 1
EN

Stack Overflow用户

发布于 2014-12-04 06:17:39

代码语言:javascript
复制
void getstring(char a[]);

这个API并没有做您想要做的事情。它有一个局部变量行,您正在向它读取一个字符串,而main()中的char数组,即a从来没有被任何东西填满。

您继续使用char数组a,认为这些值是通过调用getstring()来填充的。您需要先修复这个问题,然后再对字谜的算法进行修正。有一种叫做“参考传递”的东西可能对你有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27287503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档