【问题标题】:searching for a character throughout 4 strings in c using strchr使用 strchr 在 c 中的 4 个字符串中搜索一个字符
【发布时间】:2017-11-17 15:05:05
【问题描述】:

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

【问题讨论】:

  • 请缩进我们的代码
  • 还要注意%s 读取的是一个以空格结尾的字符串,这根本不是我所说的“文本行”,因此您的用户可能很容易混淆。

标签: c character scanf strchr


【解决方案1】:

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

来源:Simple C scanf does not work?

【讨论】:

    【解决方案2】:

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

    对于根据 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
    

    【讨论】:

      【解决方案3】:

      首先,您声明了一个大小为3char pointers 数组,同时赋予它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", &amp;s1, &amp;s2, &amp;s3, &amp;s4); 传递了第一个地址的地址(听起来很奇怪,我知道 xD)。


      scanf("%c", &amp;character); 也有一个恼人的错误,如果你之前扫描过任何以new line 结尾的东西,角色将把这个\n 作为输入。为了克服这个问题,它应该写成:scanf(" %c", &amp;character);


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

      我们需要执行以下操作:

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

      它的作用是在for循环的每次迭代开始时,它声明一个charpointer并将其初始化为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;
      }
      

      【讨论】:

      • @MariaGreenfield 随时 ;)
      猜你喜欢
      • 2021-11-28
      • 2016-01-11
      • 2013-01-18
      • 1970-01-01
      • 1970-01-01
      • 2015-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多