【问题标题】:Can't understand strlen expression argument result无法理解 strlen 表达式参数结果
【发布时间】:2017-07-17 14:10:37
【问题描述】:
#include "stdio.h"
#include "string.h"
int main(){
    char p[]="CALIFORNIA\n";
    char *x ="HELLO";
    printf("%lu\n",strlen(p+sizeof(p)-sizeof(x)+5) );
}

我搜索了所有内容,但找不到当 strlen 的参数是表达式时会发生什么。最后一条语句的结果是2,谁能解释一下?

【问题讨论】:

  • 提示:与strlen()无关。 p + sizeof p - sizeof x + 5 指向什么?如果你不能回答,那么你需要了解指针和指针算法(可能还有sizeof)。另外,strlen() 是做什么的?
  • strlen 将字符串作为参数,然后它“遍历”字符串直到 \0,计算每个字符,然后返回该计数。所以参数必须指向一个字符串。它可以是一个表达式,但对表达式求值的结果必须是一个指向字符串的指针。现在,正如 Iharob 建议的那样,检查您在做什么。
  • momo:好奇:为什么将"%lu" 编码为strlen(p)?这是通过实验发现的吗?,代码示例? '%zu" 怎么样?
  • 请注意,sizeof(x) 会给出不同的结果,具体取决于您构建的是 32 位还是 64 位程序。
  • @IharobAlAsimi 我了解 sizeof 和 strlen。在我看来,表达式是将 9*sizeof(char) 添加到 p 的起始地址,所以 strlen 是从 p[] 的第 9 位开始计算字符数?这给了我们最后 2 个字符。我现在理解正确吗?

标签: c string sizeof strlen pointer-arithmetic


【解决方案1】:

这里用到了指针算法。为了更清楚,只需运行这个演示程序即可。

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

int main(void) 
{
    char *x ="HELLO";
    const size_t N = strlen( x );

    for ( size_t i = 0; i < N; i++ )
    {
        printf( "%zu - %s\n", strlen( x + i ), x + i );
    }

    return 0;
}

它的输出是

5 - HELLO
4 - ELLO
3 - LLO
2 - LO
1 - O

至于你的例子,那么在这个声明中

printf("%lu\n",strlen(p+sizeof(p)-sizeof(x)+5) );

表达式p + sizeof( p ) 的类型为char *,该表达式产生一个指针,该指针指向数组对象p 的最后一个元素。

表达式p + sizeof( p ) - sizeof( x ) 将指针向左移动(在您的系统中,sizeof(x) 似乎等于 8)。而表达式p + sizeof( p ) - sizeof( x ) + 5 将指针向右移动。

结果整个表达式产生一个指针,指向字符数组p中的以下位置

char p[]="CALIFORNIA\n";
                   ^
                   |

因此,看起来像"A\n" 的字符串的长度等于2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 2018-03-04
    • 1970-01-01
    相关资源
    最近更新 更多