【问题标题】:Is it possible to get the number of elements currently stored in an array in C?是否可以获取当前存储在 C 数组中的元素数量?
【发布时间】:2014-10-05 04:13:15
【问题描述】:

我知道可以使用 sizeof 函数来获取大小,但它没有得到数组长度的真实计数。如果我设置了一个 int 50 的数组并且我只存储了 10 个数字,我希望得到 10 作为元素的数量,但当然这不会发生。我知道这绝对是一个微不足道的问题,但请耐心等待,如果可能的话,请帮助我。

到目前为止,我的代码需要一个完整的句子并将其存储在一个数组中。

#include <stdio.h>
#include <string.h>

int main()
{
    int i=0;
    char array[50]={0};
    fgets(array, 50, stdin);
    int len = sizeof(array);  // it doesn't work :((((((
    for(i=0; i<len; i++)
    {
        printf("%c\n", array[i]);
    }
    return 0;

}

正如你们所看到的,如果用户决定只输入一个单词让我们说“Bobby Foo”,那么我希望 len 数为 9,包括空格,但 sizeof 函数只获取数组大小的长度声明是 50.. >.>..

【问题讨论】:

  • 遗憾的是,C 数组只是低级内存块。程序员有责任跟踪(使用单独的变量)数组中存储了多少元素以及它们存储在数组的哪些位置。
  • 一个在数组中搜索换行符的函数怎么样?
  • 您可能会发现这个问题很有用:"sizeof-vs-strlen"
  • 我知道如何通过数组(搜索)的唯一方法是使用 for 循环,这意味着我需要知道 n(长度)是多少。我知道还有其他方法,但我还是个菜鸟。

标签: c


【解决方案1】:

问:C 中是否可以获取当前存储在数组中的元素个数?

  1. 简短回答:不。您需要自己跟踪此信息。

  2. 您碰巧将fgets() 与字符数组一起使用。由于在这种情况下你得到一个 C“字符串”,你可以使用 C 函数strlen()

  3. 值得注意的是,fgets() 还会返回一个换行符 - 因此您的字符串可能比您预期的要长一个(Mac、Linux)或两个(DOS/Windows)字符。

    李>

PS:

这里是关于 C 字符串的更多信息,包括“空终止”的概念(如果您还不熟悉它们):

http://www.cprogramming.com/tutorial/c/lesson9.html

【讨论】:

  • 是的,你是对的,它确实有一个换行符,当我 printf 它给了我这两个空格。我假设我可以稍后删除这条新行。
  • 感谢您的帮助和链接!
  • Ad 3) fgets 最常用于读取文本流(如stdin),因此换行(无论它碰巧在某些系统上) 转换为'\n'
【解决方案2】:

使用strlen 获取array 的大小。您需要包含string.h

sizeof() 不是一个函数,它是一个运算符。当sizeof 应用于静态数组的名称(不是通过malloc 分配的)时,结果是整个数组的大小(以字节为单位)。

如果您使用fgets,则需要从字符串中删除\n。一个简单的方法是:

array[strlen(array) - 1] = '\0';

一个简单的例子:

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

int main()
{
    int i=0;
    char array[50]={0};
    char *p;
    fgets(array, 50, stdin);
    //Remove `\n` from the array.
    if ((p=strchr(array, '\n')) != NULL)
        *p = '\0';
    size_t len = strlen(array);  // Use strlen to find the length of string
    for(i=0; i<len; i++)
    {
        printf("%c\n", array[i]);
    }
    return 0;
}

【讨论】:

  • 等等,你是认真的吗:D?我假设我们需要某种实际的代码算法。所以这只会计算存储在里面的元素数量,包括空间?
  • 可能应该在删除它之前检查'\n'并且不要使用 strlen 两次。
  • strlen(array) - 1 主要是陷入灾难。使用strchr() 方法是可行的方法。另请注意,fgets() 在任何情况下都不会附加\n。 @user3718584
  • strlen() 返回 size_t 而不是 intsizeof 相同。
  • @1336087: 1.: strlen(array) - 1: 想象一下如果你将"" 传递给strlen() - 1 会发生什么? 2.:如果fgets()\n之前遇到EOF,则不会追加\n
猜你喜欢
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 1970-01-01
  • 2020-06-02
  • 2012-02-23
  • 2019-09-15
  • 2011-08-05
  • 1970-01-01
相关资源
最近更新 更多