【问题标题】:Iterate through a string that's on an array in C遍历 C 中数组上的字符串
【发布时间】:2015-06-22 00:20:12
【问题描述】:

我有这样的代码:

char* s[4][10] = { "abc\0", "aab\0", "cbb\0" };

a 想输入一个字符,比如..'a',并遍历字符串数组,检查每个字符串是否有 'a',然后计算其上有多少个..

在这种情况下,我想得到的是"abc" : 1"aab" : 2"cbb" : 0 ... 我怎样才能循环得到这个结果?

【问题讨论】:

  • 你的代码有什么问题,id没有找到a的?而且你不需要 '\0' 它是隐含的。
  • stackoverflow != 为我做我的家庭作业。请发布您的尝试并描述您遇到的任何具体问题,有人可能会帮助您。
  • Alvaro,摆脱字符串文字中的显式空值 - 字符串文字具有隐式空值,因此 "abc\0" 有五个字符长。
  • 只是为了让你知道,我没有要求做作业,只是解决我无法解决的问题

标签: c arrays string loops character


【解决方案1】:
#include <stddef.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
    char s[10][4] = { "abc", "aab", "cbb" };
    size_t i;
    for (i = 0; i != sizeof(s) / sizeof(s[0]); i++) {
        fprintf(stdout, "%zu: %s\n", i, s[i]);
    }
    return 0;
}

#include <stddef.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
    char *s[4] = { "abc", "aab", "cbb" };
    size_t i;
    for (i = 0; i != 3; i++) {
        fprintf(stdout, "%zu: %s\n", i, s[i]);
    }
    return 0;
}

注意原来的声明

char* s[4][10] = { "abc\0", "aab\0", "cbb\0" };

有几个错误:

  • char * 而不是 char
  • [4][10] 而不是 [10][4]
  • "abc\0" 而不是 "abc"(结尾的 '\0' 是隐含的)。

【讨论】:

    【解决方案2】:

    这是一个演示程序,展示了如何处理不同的数组声明

    #include <stdio.h>
    
    int main(void) 
    {
        char* s[4][10] = { { "abc", "aab", "cbb" } };
    
        for ( int i = 0; i < 4; i++ )
        {
            for ( int j = 0; j < 10; j++ )
            {
                if ( s[i][j] )
                {
                    size_t count = 0;
                    for ( char *p = s[i][j]; *p != '\0'; ++p )
                    {
                        if ( *p == 'a' ) ++count;
                    }
    
                    printf( "\"%s\": %zu\n", s[i][j], count );
                }
            }
        }
    
        printf( "\n" );
    
        char* t[4] = { "abc", "aab", "cbb" };
    
        for ( char **p = t; *p != NULL; ++p )
        {
            size_t count = 0;
    
            for ( char *q = *p; *q != '\0'; ++q )
            {
                if ( *q == 'a' ) ++count;
            }
    
            printf( "\"%s\": %zu\n", *p, count );
        }
    
    
        printf( "\n" );
    
        char u[4][10] = { "abc", "aab", "cbb" };
    
        for ( int i = 0; i < 4; i++ )
        {
            if ( u[i][0] != '\0' )
            {
                size_t count = 0;
                for ( char *p = u[i]; *p != '\0'; ++p )
                {
                    if ( *p == 'a' ) ++count;
                }
    
                printf( "\"%s\": %zu\n", u[i], count );
            }
        }
    
        return 0;
    }
    

    程序输出是

    "abc": 1
    "aab": 2
    "cbb": 0
    
    "abc": 1
    "aab": 2
    "cbb": 0
    
    "abc": 1
    "aab": 2
    "cbb": 0
    

    您的意思似乎是数组声明的第二个变体或数组声明的第三个变体。第一个变种看起来很奇怪。:)

    考虑到字符串文字已经包含终止零。所以没有意义写,例如

    "abc\0"
    

    简单写就够了

    "abc"
    

    由于存在终止零,sizeof( "abc" ) 等于 4。

    【讨论】:

      【解决方案3】:
      char input = '\0';
      scanf("%c", &input);
      int i, j;
      for(i=0; i<4; i++)
      {
          int count = 0;
          for(j=0;j<10;j++)
          {
               if(s[i][j] == input) count++;
          }
          printf("%s : %d", s[i], count);
      }
      

      虽然请注意,简单的复制和粘贴不会教你任何东西。

      【讨论】:

      • 为什么要提供答案?这只会鼓励这类问题。
      • 这个问题相当初级,所以我想它不会有那么大的伤害,虽然原则上你是对的。
      猜你喜欢
      • 2020-09-19
      • 1970-01-01
      • 2015-09-09
      • 2011-10-06
      • 1970-01-01
      • 2012-09-12
      • 2014-06-16
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多