首先,你声明了一个char pointers
大小数组,3
同时给它4
元素:
char *charSearch[3] = {s1, s2, s3, s4};
这应该是:char *charSearch[4] = {s1, s2, s3, s4};
这个声明也应该在扫描 4char
数组的内容之后{s1,s2,s3,s4}
而不是之前完成。
任何数组的名称都是pointer
其第一个元素的 a,因此当scanf()
与char
数组一起使用时,您已经通过这样做传递了所需的地址:scanf("%s %s %s %s", s1, s2, s3, s4);
你在这里做了什么:scanf("%s %s %s %s", &s1, &s2, &s3, &s4);
传递了第一个地址的地址(听起来很奇怪,我知道 xD)。
还有一个令人讨厌的错误scanf("%c", &character);
,如果您之前扫描过任何以 a 结尾的内容new line
,角色会将\n
其作为输入。为了克服这个,它应该写成:scanf(" %c", &character);
现在到strchr()
,这个函数有两个参数,char
pointer
一个字符串和要在字符串中搜索char
pointer
的字符,如果找到它,它会返回另一个到字符的位置,NULL
否则返回。
我们需要执行以下操作:
char *ptr = strchr( charSearch[i], character );
while(ptr!=NULL)
{
ptr = strchr( ptr+1, character );
counter++;
}
它所做的是在for
循环的每次迭代开始时,它声明 achar
pointer
并将其初始化为函数的返回值strchr()
。然后我们在 thispointer
不等于时循环,NULL
并且在每次迭代中递增我们的计数器,并pointer
使其指向字符串中的下一个字符。
您的代码的最终工作版本应如下所示:
#include <stdio.h>
#include <string.h>
int main()
{
char s1[100], s2[100], s3[100], s4[100];
char character;
int counter = 0;
int i;
printf("Enter 4 lines of text: \n");
scanf("%s %s %s %s", s1, s2, s3, s4);
char *charSearch[4] = {s1, s2, s3, s4};
printf("Enter a any character to search:\n");
scanf(" %c", &character);
for(i = 0; i < 4; i++)
{
char *ptr = strchr( charSearch[i], character );
while(ptr!=NULL)
{
ptr = strchr( ptr+1, character );
counter++;
}
}
printf("Total occurrences of character %c is %d\n", character, counter);
return 0;
}