C - 计数元素(绑定检查) - 数组 [重复]

Posted

技术标签:

【中文标题】C - 计数元素(绑定检查) - 数组 [重复]【英文标题】:C - Count elements (bound check) - array [duplicate] 【发布时间】:2018-09-24 14:05:51 【问题描述】:

有什么方法可以计算指向字符串的指针数组中的元素吗?其中的元素是指其中的每个单词或短语,这是一个包含 3 的数组的示例元素(本例中的每个短语)

char *s[] = 
    "To err is human...",
    "But to really mess things up...",
    "One needs to know C!!",
;

所以这里数组有 3 个位置(即 3 个元素),每个位置都指向一个内存地址,它是字符串的开头,但仍然很难确定数组是否到达末尾,所以我添加了第四个元素'\0',所以最后会有2个空字符,然后实现这个函数。

int cantidadElementos(char *arr)

  int count=0;
  while(*arr!='\0')
      while(*arr!='\0')
          arr++;
      
      arr++;
      if(*arr!='\0')
          count++;
      
  
return count;

我尝试做的是绑定检查,所以我发现如果我使用数组中每个指针的地址,我可以看到字符串的地址,然后查看最后一个值是否为 '\0' (检查字符串是否到达末尾),但这不可能,因为数组的下一个内存地址可能包含垃圾值,所以我想出了在数组末尾添加另一个空字符,然后检查是否有一个双 '\0'。

我只是觉得这个解决方案很糟糕(有效,但仍然很糟糕)。 这可能适合文本处理器,因为它只多出 2 个字节的内存,我将使用它来确定文本是否已经结束。

回到我的问题,有没有办法计算指向字符串的指针数组中的元素?我已经搜索了很多,但找不到更好的解决方案。

【问题讨论】:

可以添加一个 NULL 指针作为哨兵。 所以我添加了第四个元素'\0',所以最后它会有2个空字符然后实现这个功能。你真的创建了char*[]这样的字符指针数组,然后使用传递给函数的char * 来尝试计算原始数组中有效指针的数量?如果你真的这样做了,你就会知道这个想法有多糟糕。 请阅读副本并考虑从接受的答案调整到第一个链接的副本;) @AnttiHaapala:不确定它是否重复......另一个问题说明您必须使用(并知道)大小。这里的代码似乎将数组传递给一个函数......它失去了大小。但至少 不清楚 因为 joop 和我没有像你那样理解同样的事情 ;-) @AndrewHenle 我做到了,它有效,还删除了 '\0' 并且仍然有效。为什么这是个坏主意?或者你的意思是在现实世界的应用程序中这是一个坏主意? 【参考方案1】:

测试一下:

const char *s[] = "To err is human...",    "But to really mess things up...",  "One needs to know C!!";
printf("%d\n",sizeof(s)/sizeof(*s));

【讨论】:

@Jean-FrançoisFabre 谢谢,已编辑... 所以,这是在计算:内存地址数量/数据类型大小。完全有效,然后我尝试删除“\0”并添加更多值,muy 函数仍然有效。 很高兴为您提供帮助!如果它有助于解决问题,请毫不犹豫地接受答案(不仅仅是这个)。【参考方案2】:

与数组不同,指针 中没有长度信息(这是当数组作为参数传递给函数时衰减到的值,就像您对cantidadElementos 所做的那样)。这正是为什么标量字符串在 C 中以空字符结尾的原因。以便库函数可以确定字符串的长度以及停止处理它的位置。

要使用指向字符串的指针来实现相同的目的,您可以在末尾使用NULL 之类的标记值。顺便说一句,main 函数的标准参数也是这样工作的:

C 标准,§5.1.2.2.1.2:

如果它们被声明,主函数的参数应该服从 以下约束:

——argv[argc] 应该是一个空指针。

【讨论】:

以上是关于C - 计数元素(绑定检查) - 数组 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

检查Bash数组中是不是存在元素[重复]

在c#中找出一个数组中出现次数最多的元素,求各种方法,要详细的代码

php数组去重方法

诚之和:Numpy怎么检查数组全为零的几种方法

C ++如何检查数组中的元素是不是相等?

c语言怎么判断两个数组中重复数字的个数?