这是我的代码。我需要找出句子中出现给定单词(短字符串)的次数(长字符串)。 样本输入: 那只猫坐在垫子上 样本输出:2 由于某种原因,字符串比较功能不起作用,我的输出为零。请忽略代码中的注释,因为它们已用于调试代码。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
char word[50];
gets(word);
int len = strlen(word);
//printf("%d",len);
char nword[len];
char s[100];
strcpy(nword,word);
puts(nword);
printf("\n");
gets(s);
//printf("%d",strlen(s));
char a[50][50];
int i,j,k;
j = 0;
for(i=0;i<strlen(s);i++)
{
a[i][j] = s[i];
printf("%c",a[i][j]);
if(s[i] == ' ')
{
j++;
printf("\n");
}
}
printf("%d",j);
k = j;
//printf("\nk assigned\n");
j = 0;
//printf("j equal to zero\n");
int count = 0;
int temp = 0;
//printf("count initialized.\n");
for(i=0;i<k;i++)
{
if(strcmp(a[i],nword) == 0)
count++;
}
printf("\n%d",count);
return 0;
}
答案 0 :(得分:1)
你的主要问题是这个循环有多种原因
int i,j,k;
j = 0;
for(i=0;i<strlen(s);i++)
{
a[i][j] = s[i];
printf("%c",a[i][j]);
if(s[i] == ' ')
{
j++;
printf("\n");
}
}
首先,你的索引是向后的 - a[i][j]
表示第i个字符串和第j个字符,但是因为你为每个单词递增j
你想要反过来 - a[j][i]
。
其次,您无法使用i
将s
和a
编入索引。想想在构建第二个字符串时会发生什么。在您的示例输入中,当i
为4时,第二个单词开始,因此第一个字符将存储为a[1][4]=s[4]
,a[1][0]
将a[1][3]
保留为未初始化。因此,您必须使用第三个变量来跟踪您在另一个字符串中的位置。
当你点击某个空格时,你不想将它添加到你的单词中,因为它以后不会匹配。您还需要在每个字符串的末尾添加一个null-terminator字符,否则您的代码将无法知道字符串结尾的位置。
将上述内容放在一起可以得到如下内容:
int i,j,k;
k = j = 0;
for(i=0;i<strlen(s);i++)
{
if(s[i] == ' ')
{
a[j][k] = '\0';
j++;
k=0;
printf("\n");
}
else
{
a[j][k] = s[i];
printf("%c",a[j][k]);
k++;
}
}
a[j][k]='\0';
答案 1 :(得分:0)
问题是a
是一个二维数组,你将它作为一个维度引用。 Maby你使用2维数组来表示i = line,j = character。如果你保持这个想法,那么你必须这样做:
j=0;
for(i=0;i<k;i++)
{
if(strcmp(a[i][j],nword) == 0)
count++;
j++;
}
然而,很难发现分成两半的单词。我建议将a
保留为一维数组。按顺序复制s[i]
的内容,如果要区分行,请使用\r\n
运算符。
答案 2 :(得分:0)
我认为您使用的二维数组错了。 a[0][j]
应该是s[i]
中的第一个单词。但你所做的是a[i][0] = s[i]
这对我来说毫无意义。
祝你好运
答案 3 :(得分:0)
我会使用函数strtok()
和strcmp()
:
int main(void)
{
char word[] = "the"; /* the word you want to count*/
char sample[] = "the cat sat on the mat"; /* the string in which you want to count*/
char delimiters[] = " ,;.";
int counter;
char* currentWordPtr;
/* tokenize the string */
currentWordPtr = strtok(sample, delimiters);
while(currentWordPtr != NULL)
{
if(strcmp(word, currentWordPtr) == 0)
{
counter++;
}
/* get the next token (word) */
currentWordPtr = strtok(NULL, delimiters);
}
printf("Number of occurences of \"%s\" is %i\n", word, counter);
return 0;
}