在以下数组中:
["fix", "cache", "four"];
是否可以获取数组中字符的总长度? = 3 + 5 + 4 = 12
?目前,我正在做的是将各个字符串的所有长度加在一起:
char * strings[] = {"fix", "cache", "four", NULL};
size_t len_strings = 0;
for (int i=0; strings[i] != NULL ;i++)
len_strings += strlen(strings[i]);
printf("StringLength: %lu\n", len_strings);
// StringLength: 12
此外,为什么不能代替以下内容?
for (int i=0; *strings != NULL ;i++) {
len_strings += strlen(*strings++);
}
我可以进行以下操作(但我相信这与执行数组偏移相同,只是使用了不同的符号)
for (int i=0; *(strings+i) != NULL ;i++) {
len_strings += strlen(*(strings+i));
}
答案 0 :(得分:0)
您正在做的唯一可能的方法是:遍历数组并检查每个字符串。
指针增量无效,因为strings
不是指针。这是一个数组,因此您无法执行array++
。但是,您可以使用它进行指针运算。您还可以使用指针来执行您最初想要的操作:
#include <stdio.h>
#include <string.h>
int main(void)
{
char * strings[] = {"fix", "cache", "four", NULL};
char **pointer = strings;
size_t len_strings = 0;
for (int i=0; *pointer != NULL ;i++) {
len_strings += strlen(*(pointer++));
}
printf("StringLength: %lu\n", len_strings);
}
这并不好,也没有比索引数组差。这只是处理pointer++
的一种方法。请注意,(pointer++)
周围的括号不是强制性的,但最好保留它们。当您拥有两个具有相同优先级的运算符,并且每个运算符都位于操作数的一侧时,依赖于运算符优先级会造成混淆。
最后,您的信念是正确的。对于任何数组,此:
array[i]
与
相同*(array + i)
答案 1 :(得分:0)
您必须遍历strings数组的每个字符串以获得所有字符串的总长度。
strings
是char
指针的 array 。您不能将++
运算符与strings
变量(*strings++
)一起使用,因为它不允许更改数组的地址。如果要使用指针,可以这样做
char **p_strs = strings;
for (int i=0; *p_strs != NULL ;i++) {
len_strings += strlen(*p_strs++);
}
是的,*(strings+i)
与strings[i]
相同。根据C Standard#6.5.2.1:
下标运算符[]的定义是E1 [E2]等于(*((E1)+(E2))))。