所以我应该写一个Soundex转换器代码并打印文件中的行,如果它的一个单词与输入有相同的Soundex代码。我成功地为Soundex转换编写了一个函数但是我坚持在比较部分。很抱歉,如果这听起来微不足道,但是当我逐行比较单词时,strcmp似乎每次都失败了。这是代码......对不起,如果太长了
#include<string.h>
#include<ctype.h>
#include<stdio.h>
#include<stdlib.h>
char *soundex(char *s,char* name)
{
int si = 1;
char c;
//char *s = (char *)malloc(1000);
// ABCDEFGHIJKLMNOPQRSTUVWXYZ
char mappings[] = "01230120022455012623010202";
s[0] = toupper(name[0]);
for(int i = 1, l = strlen(name); i < l; i++)
{
c = toupper(name[i]) - 65;
if(c >= 0 && c <= 25)
{
if(mappings[c] != '0')
{
if(mappings[c] != s[si-1])
{
s[si] = mappings[c];
si++;
}
if(si > 3)
{
break;
}
}
}
}
if(si <= 3)
{
while(si <= 3)
{
s[si] = '0';
si++;
}
}
//printf("%s\n",s);
return s;
}
void search(char line[10000],char str[1000])
{
int i,j=0;
char test[1000];
char s[1000];
char b[1000];
for(i=0;line[i] != '\0';i++)
{
if(line[i] == ' ')
continue;
test[j] = line[i];
j++;
if(line[i+1] == ' ' || line[i+1] == '\0')
{
//soundex(test);
test[j] = '\0';
if(strcmp(soundex(s,test),soundex(b,str)) == 0);
{
printf("%s\n",soundex(s,test));
printf("%s\n",soundex(b,str));
printf("%s",line);
break;
}
j = 0;
memset(test,0,strlen(test));
}
}
}
int main()
{
char a[1000],f[1000];
char s[1000];
gets(a);
//soundex(s,a);
//printf("%s",s);
scanf("%s",f);
FILE *fp=fopen(f,"r");
if(fp==NULL)
{
printf("File doesnot exist bro");
}
else
{
long long linenum=1;
char line[10000];
while(fgets(line,10000,fp)!=NULL) //Or fscanf
{
search(line,a);
//printf("%s",line);
linenum++;
}
}
fclose(fp);
}
问题出现在搜索功能中的strcmp命令,因为即使在结果不同之后它也会打印行。我甚至打印后的比较结果以确定。任何线索都会受到重视。再次抱歉长码。
答案 0 :(得分:1)
关闭;
。 不要忽略编译器警告!
prog.c:70:17: warning: this ‘if’ clause does not guard... [-Wmisleading-indentation]
if(strcmp(soundex(s,test),soundex(b,str)) == 0);
if(strcmp(soundex(s,test),soundex(b,str)) == 0)
也
prog.c: In function ‘search’:
prog.c:68:25: warning: statement with no effect [-Wunused-value]
test[j] == '\0';
和
prog.c: In function ‘main’:
prog.c:89:9: warning: implicit declaration of function ‘gets’ [-Wimplicit-function-declaration]
gets(a);