使用strchr在c中的4个字符串中搜索一个字符

searching for a character throughout 4 strings in c using strchr

我无法弄清楚为什么当我 运行 程序不让我扫描我想要搜索的字符时。它直接跳到最后一个 printf 语句。

int main()
{
char s1[100], s2[100], s3[100], s4[100];
char character
char *charSearch[3] = {s1, s2, s3, s4};
int counter = 0;
int i;

printf("Enter 4 lines of text: \n");
scanf("%s %s %s %s", &s1, &s2, &s3, &s4);
printf("Enter a any character to search:\n");

scanf("%c", &character);

for(i = 0; i < 3; i++)
{
while(charSearch[i] = strchr(  charSearch, character ))
{
counter++;
charsearch[i]++;
}
}
printf("Total occurrences of character %c is %d", character, counter);

return 0;
}

这是因为使用[=10=读取输入时,输入是在按下return键之后读取的,但是return键生成的换行符并没有被[=10消耗掉=],这意味着下次您从标准输入读取一个字符时,将会有一个换行符可供读取。

来源:Simple C scanf does not work?

俄罗斯黑客会帮助你。:)

对于根据 C 标准的初学者,不带参数的函数 main 应声明为

int main( void )

尽量不要使用幻数。编译器应发出与此声明相关的诊断消息

char *charSearch[3] = {s1, s2, s3, s4};

因为初始化器比数组中的元素多。

这个带有scanf的语句是不安全的,而且参数表达式是无效的。

scanf("%s %s %s %s", &s1, &s2, &s3, &s4);

最好在该语句的格式说明符中放置一个空格

scanf("%c", &character);
      ^^^^

否则可以读取空白字符(例如新行字符)。

while 语句中的条件没有意义

while(charSearch[i] = strchr(  charSearch, character ))

程序可以这样看

#include <stdio.h>
#include <string.h>

#define SIZE 100

int main( void )
{
    char s1[SIZE], s2[SIZE], s3[SIZE], s4[SIZE];
    char * charSearch[] = { s1, s2, s3, s4 };
    const size_t N = sizeof(charSearch) / sizeof(*charSearch);
    char character;

    size_t counter = 0;

    printf( "Enter %zu lines of text: \n", N );

    for (size_t i = 0; i < N; i++)
    {
        charSearch[i][0] = '[=15=]';
        fgets(charSearch[i], SIZE, stdin);
    }

    printf("Enter any character to search:\n");

    scanf(" %c", &character );

    for (size_t i = 0; i < N; i++)
    {
        for (char *p = charSearch[i]; ( p = strchr(p, character) ) != NULL; ++p )
        {
            ++counter;
        }
    }

    printf("Total occurrences of character %c is %zu\n", character, counter);

    return 0;
}

程序输出可能看起来像

Enter 4 lines of text:
Hello World
How are you?
Whosebug
I'm learning C
Enter any character to search:
e
Total occurrences of character e is 4

首先,您声明了一个 char pointers 大小为 3 的数组,同时给它 4 个元素: char *charSearch[3] = {s1, s2, s3, s4};

这应该是:char *charSearch[4] = {s1, s2, s3, s4}; 此声明也应在扫描 4 char 数组 {s1,s2,s3,s4} 的内容之后而不是之前完成。


任何数组的名称都是其第一个元素的 pointer,因此当使用 scanf()char 数组时,您已经通过这样做传递了所需的地址:scanf("%s %s %s %s", s1, s2, s3, s4);

你在这里做了什么:scanf("%s %s %s %s", &s1, &s2, &s3, &s4); 传递了第一个地址的地址(我知道 xD 听起来很奇怪)。


scanf("%c", &character); 还有一个令人恼火的错误,如果您之前扫描过任何以 new line 结尾的内容,角色将把这个 \n 作为其输入。为了克服这一点,它应该写成:scanf(" %c", &character);


现在到strchr(),这个函数有两个参数,一个char pointer一个字符串和要在字符串中搜索的字符,它returns如果找到了另一个 char pointer 到字符的位置,否则 NULL

我们需要改为执行以下操作:

char *ptr = strchr( charSearch[i], character );
    while(ptr!=NULL)
    {
        ptr = strchr( ptr+1, character );
        counter++;
    }

它所做的是在for循环的每次迭代开始时,它声明一个char pointer并将其初始化为return值strchr() 函数。然后我们在这个 pointer 不等于 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;
}