C用指针迭代char数组

时间:2018-01-21 12:58:07

标签: c arrays string pointers sizeof

我是C的新手,想知道如何使用指针获取数组的每个元素。当且仅当您知道阵列的大小时,这很容易。 所以让代码为:

#include <stdio.h>

int main (int argc, string argv[]) {
    char * text = "John Does Nothing";
    char text2[] = "John Does Nothing";

    int s_text = sizeof(text); // returns size of pointer. 8 in 64-bit machine
    int s_text2 = sizeof(text2); //returns 18. the seeked size.

    printf("first string: %s, size: %d\n second string: %s, size: %d\n", text, s_text, text2, s_text2);

    return 0;
}

现在我想确定text的大小。为此,我发现,String将以'\0'字符结尾。所以我写了以下函数:

int getSize (char * s) {
    char * t; // first copy the pointer to not change the original
    int size = 0;

    for (t = s; s != '\0'; t++) {
        size++;
    }

    return size;
}

但是这个函数不起作用,因为循环似乎没有终止。

那么,有没有办法获得指针所指向的char的实际大小?

2 个答案:

答案 0 :(得分:4)

您必须检查当前值,而不是检查指针。你可以这样做:

int getSize (char * s) {
    char * t; // first copy the pointer to not change the original
    int size = 0;

    for (t = s; *t != '\0'; t++) {
        size++;
    }

    return size;
}

或者更简洁:

int getSize (char * s) {
    char * t;    
    for (t = s; *t != '\0'; t++)
        ;
    return t - s;
}

答案 1 :(得分:2)

此for循环中存在拼写错误

for (t = s; s != '\0'; t++) {
            ^^^^^^^^^          

我认为你的意思是

for (t = s; *t != '\0'; t++) {
            ^^^^^^^^^          

尽管如此,通常该函数不提供等于运算符sizeof返回的值的值,即使您还将计算终止零值。相反,它提供的值等于标准函数strlen返回的值。

例如,比较此代码段的输出

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

//...

char s[100] = "Hello christopher westburry";

printf( "sizeof( s ) = %zu\n", sizeof( s ) );
printf( "strlen( s ) = %zu\n", strlen( s ) + 1 );

所以你的函数只是计算一个字符串的长度。

以下列方式(使用指针)定义它会更正确

size_t getSize ( const char * s ) 
{
    size_t size = 0;

    while ( *s++ ) ++size;

    return size;
}