我在弄清楚为什么在运行程序时不会让我扫描我要搜索的字符时遇到一些麻烦。它只是跳到最后一个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;
}
答案 0 :(得分:0)
这是因为当使用scanf
读取输入时,在按下返回键后读取输入,但返回键生成的换行不会被scanf
消耗,这意味着下次读取时来自标准输入的字符将有一个准备好读取的换行符。
答案 1 :(得分:0)
俄罗斯黑客会帮助你。:)
对于根据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] = '\0';
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?
Stackoverflow
I'm learning C
Enter any character to search:
e
Total occurrences of character e is 4
答案 2 :(得分:-1)
首先,您在声明了char pointers
大小为3
的数组4
时为其声明了char *charSearch[3] = {s1, s2, s3, s4};
元素:
char *charSearch[4] = {s1, s2, s3, s4};
这应该是:char
此声明也应在扫描4 {s1,s2,s3,s4}
数组pointer
的内容后完成,而不是之前。
任何数组的名称都是scanf()
的第一个元素,因此当char
与scanf("%s %s %s %s", s1, s2, s3, s4);
数组一起使用时,您已经通过这样做传递了所需的地址:{{1} }
你在这里做了什么:scanf("%s %s %s %s", &s1, &s2, &s3, &s4);
传递了第一个地址的地址(听起来很奇怪,我知道xD)。
scanf("%c", &character);
还有一个令人恼火的错误,如果您之前扫描了以new line
结尾的任何内容,则该字符将以此\n
作为输入。为了解决这个问题,应该写成:scanf(" %c", &character);
现在到strchr()
,此函数需要两个参数,一个字符串char
pointer
和字符串中要搜索的字符,它返回另一个char
{ {1}}到角色的位置(如果找到),否则pointer
。
我们需要做以下事情:
NULL
它的作用是在char *ptr = strchr( charSearch[i], character );
while(ptr!=NULL)
{
ptr = strchr( ptr+1, character );
counter++;
}
循环的每次迭代开始时,它声明for
char
并将其初始化为pointer
的返回值功能。然后我们循环,而strchr()
不等于pointer
,并且在每次迭代中递增我们的计数器和我们的NULL
,使其指向字符串中的下一个字符。
代码的最终工作版本应如下所示:
pointer