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;
}
4

3 回答 3

0

这是因为使用 读取输入时scanf,按下回车键后会读取输入,但回车键生成的换行符不会被 消耗掉scanf,这意味着下次从标准输入读取字符时,将准备好换行符读。

资料来源:简单的 C scanf 不起作用?

于 2017-11-17T15:26:32.137 回答
0

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

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

int main( void )

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

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

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

这个 with 语句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
于 2017-11-17T15:26:33.497 回答
-1

首先,你声明了一个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;
}
于 2017-11-17T15:42:04.230 回答