【问题标题】:for sizeof(x) VS while ([x] != '\0') in C对于 sizeof(x) VS while ([x] != '\0') 在 C
【发布时间】:2021-03-25 10:27:41
【问题描述】:

我只是想知道使用之间是否有区别

for(i = 0; i < sizeof(argv[1]) / sizeof(argv[1][0]); i++) {

while (argv[1][i] != '\0')

我只是好奇,我找不到任何关于它的信息。

(目标是putcharchar*的每个字符)

【问题讨论】:

  • sizeof(argv[1]) 是指针的大小。 argc 告诉你数组 *argv[] 的长度。
  • @WeatherVane 看起来 OP 正在寻找单个参数的长度,而不是它们的数量
  • 要获取argv[1]的长度,请使用strlen(argv[1])
  • 你需要了解指针和数组的区别。如果你从main() 得到argv,它是指向char 的(数组)指针(数组)的指针。 argv[1] 是一个指针,sizeof argv[1] 将返回指针的大小,而不是数组。
  • while (argv[1][i] != '\0')while (argv[1][i]) 相同

标签: c pointers char sizeof c-strings


【解决方案1】:

这两种情况有本质的区别。

表达式argv[1] 是一个类型为char * 的指针,通常占用4 或8 个字节,具体取决于所使用的系统,等于表达式sizeof(argv[1]) / sizeof(argv[1][0]) 的值或等价于表达式sizeof( argv[1] )因为sizeof( argv[1][0] )sizeof( char ) 一样,最后一个总是等于1

另一方面,指针可以指向包含比 4 或 8 个更多(或更少)字符的字符串。

但即使您将 sizeof 运算符应用于声明为例如的字符数组(而不是指针)

char s[] = "Hello";

那么即使在这种情况下,循环的条件也会有所不同。就是这个for循环

for(i = 0; i < sizeof( s ) / sizeof( s[0]); i++) {

等价于

for(i = 0; i < 6; i++) {

因为终止零也包含在数组中。也就是说,循环体也将获得角色'\0'的控制权。

在这个循环中

while ( s[i] != '\0')

遇到字符 '\0' 时停止迭代。

这是一个演示程序,显示了差异。程序输出符号的ASCII码。

#include <stdio.h>

int main(void) 
{
    char s[] = "Hello";
    
    for ( size_t i = 0; i < sizeof( s ) / sizeof( s[0]); i++ )
    {
        printf( "%d ", s[i] );
    }
    
    putchar( '\n' );
    
    size_t i = 0;
    
    while ( s[i] != '\0' )
    {
        printf( "%d ", s[i] );
        ++i;
    }
    
    putchar( '\n' );
    
    
    return 0;
}

程序输出是

72 101 108 108 111 0 
72 101 108 108 111 

【讨论】:

    【解决方案2】:

    它们不是一回事(尽管它们很接近)。

    第一个

    for(i = 0; i < sizeof(argv[1]) / sizeof(argv[1][0]); i++) {
    

    意思是:

    1. i 设置为0

    2. sizeof(argv[1]) / sizeof(argv[1][0]) 表示strlen(argv[1]),所以它的意思是

    while i is less than the length of argv[1]
    

    这和

    基本一样
    int i = 0;
    while(argv[1][i++] != '\0')
    

    有两个区别:

    1. 在第二个中,i 永远不会设置为 0

    2. 在第二个中,i 永远不会递增(尽管在循环本身中它可能会递增)

    【讨论】:

    • sizeof(argv[1]) / sizeof(argv[1][0]) 不代表strlen(argv[1])。前者是指针argv[1]的大小除以charargv[1][0]的大小,这通常与以argv[1]开头的字符串的长度不同,因为指针与传递给程序的任何字符串都没有关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 2013-01-09
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    相关资源
    最近更新 更多