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 - 计数元素(绑定检查) - 数组 [重复]的主要内容,如果未能解决你的问题,请参考以下文章