比较从文件中读取的字符串
comparing strings read from a file
我写了一个程序,用户在其中输入一个字符串,然后将该字符串与文件中的每个字符串进行比较。如果文件中的任何字符串或子字符串与用户输入的字符串匹配,则应显示文件中的字符串。
我的 NOW.txt 文件的内容:
india
ind
in
indian
i
indians
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int i,j,n,p;
char m[50], d[50];
FILE *fp;
fp=fopen("NOW.TXT","r");
printf("Enter a word\n");
scanf("%s", m);
n = strlen(m);
while( fgets (d, 50, fp)!=NULL )
{
p=strlen(d);
for(j=0; j<p; j++){
for (i=0; i<n; i++){
if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7] && m[8]==d[8] && m[9]==d[9] && m[10]==d[10] && m[11]==d[11] && m[12]==d[12] && m[13]==d[13] && m[14]==d[14] && m[15]==d[15])
printf("%s ",d );
else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7] && m[8]==d[8] && m[9]==d[9] && m[10]==d[10] && m[11]==d[11] && m[12]==d[12] && m[13]==d[13] && m[14]==d[14] )
printf("%s ",d );
else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7] && m[8]==d[8] && m[9]==d[9] && m[10]==d[10] && m[11]==d[11] && m[12]==d[12] && m[13]==d[13] )
printf("%s ",d );
else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7] && m[8]==d[8] && m[9]==d[9] && m[10]==d[10] && m[11]==d[11] && m[12]==d[12])
printf("%s ",d );
else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7] && m[8]==d[8] && m[9]==d[9] && m[10]==d[10] && m[11]==d[11] )
printf("%s ",d );
else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7] && m[8]==d[8] && m[9]==d[9] && m[10]==d[10])
printf("%s ",d );
else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7] && m[8]==d[8] && m[9]==d[9] )
printf("%s ",d );
else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7] && m[8]==d[8])
printf("%s ",d );
else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7])
printf("%s ",d );
else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] )
printf("%s ",d );
else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] )
printf("%s ",d );
else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4])
printf("%s ",d );
else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] )
printf("%s ",d );
else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] )
printf("%s ",d );
else if( m[0]==d[0] && m[1]==d[1])
printf("%s ",d );
else if( m[0]==d[0] )
printf("%s ",d );
else
printf(" No such word exists in file");
}
}
}
}
当我输入时:
india
输出应该是:
india
indian
indians
我做错了什么?
检查函数:
char *strstr(const char *haystack, const char *needle)
(https://www.tutorialspoint.com/c_standard_library/c_function_strstr.htm)
或
int strncmp(const char *str1, const char *str2, size_t n)
(https://www.tutorialspoint.com/c_standard_library/c_function_strncmp.htm)
这将帮助您进行子字符串匹配。
您的程序可能会更改为(未选中):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char m[50], d[50];
FILE *fp;
fp=fopen("NOW.TXT","r");
printf("Enter a word\n");
scanf("%s", m);
while( fgets (d, 50, fp)!=NULL )
{
if (strstr(d, m) != NULL) {
printf("%s ", d);
}
}
}
我可以为此给出一个算法。您可以做的是从文本文件中读取整个文本并将其分配给单个 string.Then 将从文本文件中获得的字符串拆分为以 space 作为分隔符的单词,并将它们添加到数组中。
到目前为止,您已经将那个文本文件的所有单词放在一个数组中了..!!
现在您可以对数组中的每个字符串检查它是否包含用户给出的输入...如果是,则打印该字符串..
希望对您有所帮助:)
所以这段代码完全没有意义。
for(j=0; j<p; j++){
for (i=0; i<n; i++){
if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7] && m[8]==d[8] && m[9]==d[9] && m[10]==d[10] && m[11]==d[11] && m[12]==d[12] && m[13]==d[13] && m[14]==d[14] && m[15]==d[15])
您正在为 d
中的每个字符遍历 m
中的所有字符,然后随机比较两个字符串中的字符,而不考虑每个字符串的长度。
您可以通过多种方式来完成您想要做的事情,但为了与您当前的设计保持一致,您需要这样的东西:
for(j=0;j<p;j++) {
for(i=0;(i+j<p) && (i<n) && (m[i]==d[i+j]);i++);
if(i==n) {
printf("%s ",d);
break;
}
}
这将循环遍历 d
中的每个字符并查找在 2 个字符串之间匹配的 n
个字符。在第二个循环之后,i
将包含匹配的字符数,因此如果它等于 n
那么您就赢了。
我写过 post 有时回到同一个地方..可能对你有帮助..
http://clanguagestuff.blogspot.in/2015/06/comparing-username-stored-in-file-in-c.html
没有真正的答案更像是一般的帮助。
这个程序在可读性方面有很多问题。
不要使用无法使用的变量名。尝试使用能够自我解释的名称,例如 "numberOfLetters"。不要仅仅因为它们很短就强迫自己使用短变量。您仍然可以使用 i、j、k 进行计数,因为它们被广泛执行并因此而闻名,但一般来说:Readability > Short
如果你有像这个巨人一样看起来非常重复的问题 "else if" 你可以使用循环。在这种情况下,某种循环使每次迭代都减少一个值。
我写了一个程序,用户在其中输入一个字符串,然后将该字符串与文件中的每个字符串进行比较。如果文件中的任何字符串或子字符串与用户输入的字符串匹配,则应显示文件中的字符串。
我的 NOW.txt 文件的内容:
india
ind
in
indian
i
indians
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int i,j,n,p;
char m[50], d[50];
FILE *fp;
fp=fopen("NOW.TXT","r");
printf("Enter a word\n");
scanf("%s", m);
n = strlen(m);
while( fgets (d, 50, fp)!=NULL )
{
p=strlen(d);
for(j=0; j<p; j++){
for (i=0; i<n; i++){
if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7] && m[8]==d[8] && m[9]==d[9] && m[10]==d[10] && m[11]==d[11] && m[12]==d[12] && m[13]==d[13] && m[14]==d[14] && m[15]==d[15])
printf("%s ",d );
else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7] && m[8]==d[8] && m[9]==d[9] && m[10]==d[10] && m[11]==d[11] && m[12]==d[12] && m[13]==d[13] && m[14]==d[14] )
printf("%s ",d );
else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7] && m[8]==d[8] && m[9]==d[9] && m[10]==d[10] && m[11]==d[11] && m[12]==d[12] && m[13]==d[13] )
printf("%s ",d );
else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7] && m[8]==d[8] && m[9]==d[9] && m[10]==d[10] && m[11]==d[11] && m[12]==d[12])
printf("%s ",d );
else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7] && m[8]==d[8] && m[9]==d[9] && m[10]==d[10] && m[11]==d[11] )
printf("%s ",d );
else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7] && m[8]==d[8] && m[9]==d[9] && m[10]==d[10])
printf("%s ",d );
else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7] && m[8]==d[8] && m[9]==d[9] )
printf("%s ",d );
else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7] && m[8]==d[8])
printf("%s ",d );
else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7])
printf("%s ",d );
else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] )
printf("%s ",d );
else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] )
printf("%s ",d );
else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4])
printf("%s ",d );
else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] )
printf("%s ",d );
else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] )
printf("%s ",d );
else if( m[0]==d[0] && m[1]==d[1])
printf("%s ",d );
else if( m[0]==d[0] )
printf("%s ",d );
else
printf(" No such word exists in file");
}
}
}
}
当我输入时:
india
输出应该是:
india
indian
indians
我做错了什么?
检查函数:
char *strstr(const char *haystack, const char *needle)
(https://www.tutorialspoint.com/c_standard_library/c_function_strstr.htm)
或
int strncmp(const char *str1, const char *str2, size_t n)
(https://www.tutorialspoint.com/c_standard_library/c_function_strncmp.htm)
这将帮助您进行子字符串匹配。
您的程序可能会更改为(未选中):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char m[50], d[50];
FILE *fp;
fp=fopen("NOW.TXT","r");
printf("Enter a word\n");
scanf("%s", m);
while( fgets (d, 50, fp)!=NULL )
{
if (strstr(d, m) != NULL) {
printf("%s ", d);
}
}
}
我可以为此给出一个算法。您可以做的是从文本文件中读取整个文本并将其分配给单个 string.Then 将从文本文件中获得的字符串拆分为以 space 作为分隔符的单词,并将它们添加到数组中。
到目前为止,您已经将那个文本文件的所有单词放在一个数组中了..!!
现在您可以对数组中的每个字符串检查它是否包含用户给出的输入...如果是,则打印该字符串..
希望对您有所帮助:)
所以这段代码完全没有意义。
for(j=0; j<p; j++){
for (i=0; i<n; i++){
if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7] && m[8]==d[8] && m[9]==d[9] && m[10]==d[10] && m[11]==d[11] && m[12]==d[12] && m[13]==d[13] && m[14]==d[14] && m[15]==d[15])
您正在为 d
中的每个字符遍历 m
中的所有字符,然后随机比较两个字符串中的字符,而不考虑每个字符串的长度。
您可以通过多种方式来完成您想要做的事情,但为了与您当前的设计保持一致,您需要这样的东西:
for(j=0;j<p;j++) {
for(i=0;(i+j<p) && (i<n) && (m[i]==d[i+j]);i++);
if(i==n) {
printf("%s ",d);
break;
}
}
这将循环遍历 d
中的每个字符并查找在 2 个字符串之间匹配的 n
个字符。在第二个循环之后,i
将包含匹配的字符数,因此如果它等于 n
那么您就赢了。
我写过 post 有时回到同一个地方..可能对你有帮助..
http://clanguagestuff.blogspot.in/2015/06/comparing-username-stored-in-file-in-c.html
没有真正的答案更像是一般的帮助。
这个程序在可读性方面有很多问题。
不要使用无法使用的变量名。尝试使用能够自我解释的名称,例如 "numberOfLetters"。不要仅仅因为它们很短就强迫自己使用短变量。您仍然可以使用 i、j、k 进行计数,因为它们被广泛执行并因此而闻名,但一般来说:Readability > Short
如果你有像这个巨人一样看起来非常重复的问题 "else if" 你可以使用循环。在这种情况下,某种循环使每次迭代都减少一个值。