使用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;
}
我无法弄清楚为什么当我 运行 程序不让我扫描我想要搜索的字符时。它直接跳到最后一个 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;
}