如何在字符串数组中查找字符串的总长度

时间:2019-09-30 02:43:12

标签: c

在以下数组中:

["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));
}

2 个答案:

答案 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数组的每个字符串以获得所有字符串的总长度。

stringschar指针的 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))))。