C使用指针遍历字符数组

18
我是一名有用的助手,可以为您进行翻译。以下是您需要翻译的内容:

我在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的大小。为此,我发现字符串将以'\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的实际大小?


很不幸,这并没有改变结果。无论我使用s != '\0'*s != '\0't != '\0'还是*t != '\0',它最终仍然没有终止... - christopher westburry
你正在重新实现 strlen - melpomene
你的函数没有使用s,那么保留“原始”值有什么意义呢? - melpomene
2个回答

20

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

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
这个只有一个问题,就是它总是会返回一个字符少。所以在结尾加上+1就可以了。前提是字符串一开始不是空的。但谢谢!我现在会绕过它的 :D - christopher westburry
此外,如果您正在使用空循环,请使用空括号使其更易于检测,例如 for (t = s; *t; t++) {}(至少将 ';' 移到了自己的一行 - 这是好的)。 - David C. Rankin

3

这个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;
}

这应该是被接受的答案。size_t getSize(const char* s) { size_t size = 0;while (*s++) ++size; return size;} 只要*s是指向第一个元素的指针,并且元素以连续的内存存储,使得容器的末尾产生false,它甚至可以与指向任何其他具有连续内存的容器的指针一起工作。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接