我很难得到"isZero“函数来检测单词是否是anagram。如果问"isZero“是否等于main()中的1,它只会给出"anagram”。如果我把它设为0,它只会给我“不是字谜”。对我来说,这不是计算任何东西,它只是打印出任何陈述是对的,目前。不知道如何解决这个问题,可能需要一些指导。
#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);
}发布于 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库的一部分,因为它很容易被破坏和利用。使用fgets、getline或scanf (如果选择使用scanf 格式字符串,请阅读关于正确使用该格式字符串的整个章节)。这是一个很好的功能,但它有许多陷阱,只是等待一个人,部分理解它的使用。
话虽如此,你有一个整体的逻辑来处理字谜。下面,我提供了一个示例,说明了在整理您的代码时的上述要点。花点时间读一读,明白我为什么要做这些改变。此外,我还为输入的单词添加了一个快速的length检查。如果它们的长度不一样,就没有必要更进一步。如果你有问题请告诉我。这里有很多好人很乐意帮忙。
#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);
}输出:
$ ./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.发布于 2014-12-04 06:17:39
void getstring(char a[]);这个API并没有做您想要做的事情。它有一个局部变量行,您正在向它读取一个字符串,而main()中的char数组,即a从来没有被任何东西填满。
您继续使用char数组a,认为这些值是通过调用getstring()来填充的。您需要先修复这个问题,然后再对字谜的算法进行修正。有一种叫做“参考传递”的东西可能对你有帮助。
https://stackoverflow.com/questions/27287503
复制相似问题