【问题标题】:how to count string array elements in C?如何计算C中的字符串数组元素?
【发布时间】:2012-08-21 04:06:11
【问题描述】:

我希望我的循环只重复尽可能多的次数,因为许多是“水果”数组中的字符串。

首先使用“while”循环进行了尝试,但我无法使其正常工作(现在它已被注释),因为(如调试器所示)它在第 4 次迭代时出现了段错误。此方法应适用于字符或整数数组,但不适用于字符串数组。为什么会这样?

然后我尝试使用“for”循环并希望它在达到数组中存储在“count”变量中的字符串元素总数时停止。但是,我找不到计算数组中字符串数的好方法。这甚至可能吗? "sizeof" 运算符在这里似乎不是一个好的解决方案。

提前感谢您的回复。

#include <stdio.h>

int main()
{
    char *fruits[]={"Apple", "Grapefruit", "Banana"};
    int i=0;
    int count=sizeof(*fruits);


    char **bitter=&fruits[1];

    printf("Bitter fruit is: %s", *bitter);

    puts(" ");

    printf("All fruits are: ");

    for (;i<count;i++);
    {
        printf("%s ",*(fruits+i));
    }

    /*
        while ( fruits[i] != '\0')
        {
        printf("%s ",*(fruits+i));
        }

    stuff above failed. why?
    */


    return 0;
}

【问题讨论】:

  • 使用for循环和计算数组字符串元素的东西是否可能?

标签: c arrays string for-loop while-loop


【解决方案1】:

一种简单的方法是将 NULL 附加到您的列表中:

char *fruits[] = {"Apple", "Grapefruit", "Banana", NULL};

然后你可以像这样打印所有水果:

int i = 0;
while (fruits[i] != NULL) {
    printf ("%s ",*(fruits+i));
    i++;
}

至于你原来的while循环为什么失败:

  • 您的 i 不会递增
  • 您正在检查fruits[i] != '\0' 是否fruits[i] 是指向char 的指针,而'\0' 是等于0 的char。所以您实际上是在检查fruits[i] 是否指向0,但对于第一个三次迭代不是这种情况,因为fruits[i] 指向相应水果的第一个字符,而在第四次迭代中fruits[i] 指向不属于您的程序的内存位置。

【讨论】:

  • 很好,但写fruits[i] 可能比*(fruits+i) 更简洁。
  • 谢谢@eyelash。 @PaulR *(fruits+i) 出现只是因为我最近想熟悉指针。
【解决方案2】:
#include <stdio.h>
int main()
{
    char *fruits[]={"Apple", "Grapefruit", "Banana"};
    int i=0;
    int count=sizeof(fruits)/sizeof(fruits[0]);
    char **bitter=&fruits[1];

    printf("Bitter fruit is: %s\n", *bitter);
    printf("All fruits are:\n");
    for(i=0;i<count;i++)
    {
        printf("%s\n",fruits[i]);
    }
    return 0;
}

【讨论】:

  • 这不起作用,因为 (sizeof(fruits[0])) 小于 sizeof(fruits[1]) 等...所以没有统一的大小。您的方法适用于一组固定大小的元素,例如 int numbers[] 等...
【解决方案3】:

您也可以考虑使用标题 string.h 中的 strlen() :

#include <stdio.h>
#include <string.h>
int main()
{
    char *myarray[] = {"Mere", "Pere", "Gutui"};
    int i = 0;
    int lungime = strlen(*myarray);

    while (i < (lungime - 1)){
            printf("Fruit no. %d is %s\n", i, *(myarray + i));
            i++;
    }
    return 0;
}

【讨论】:

  • -1 这是完全错误的。您正在使用字符串"Mere" 的长度作为myarray 的长度。 strlen 确实 not 返回数组的长度。它返回以 nul 结尾的字符串的长度。
猜你喜欢
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 2017-02-25
相关资源
最近更新 更多