c - 使用指针遍历字符串



我正在尝试使用指针打印字符串的每四个字符。

我能够使用以下代码实现它:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char const *argv[]){
char* string = "WhatTheeHell";
char* p = string;
while(*p != ''){
    printf("%cn", *p);
    p += 4;
}
return 0;
}

这正确地将输出给我:

W

T

H

现在,我尝试了另一种方法来做到这一点,根据我对指针算术的了解,它应该有效,因为我机器上的 int 大小是 4 字节。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char const *argv[]){

    char* string = "WhatTheeHell";
    int* p = (int*)string;
    while(*p != ''){
        printf("%cn", *p);
        p += 1;
    }
    return 0;
}

当我为此打印输出时,它给了我 WTH,后跟四个换行符。

我的问题是,为什么要打印四个换行符?难道不应该是在打印 H 后,*p 在字符串文字的末尾给出一个 NULL 字符并且循环终止吗?

对于初学者来说,第一个程序是无效的。如果字符串的字符数不能被4整除,您将具有未定义的行为,因为指针可以使用指针算法指向字符串之外

p += 4;

有效的方法可以如下所示,如演示程序所示

#include <stdio.h>
int main( void )
{
    const char *s = "WhatTheeHell";
    const size_t STEP = 4;
    if ( *s )
    {
        const char *p = s;
        do
        {
            printf( "%cn", *p );
            for ( size_t i = 0; i < STEP && *p; ++i, ++p );
        } while ( *p );            
    }
}

它的输出是

W
T
H

第二个你的程序也是无效的。对于初学者来说,字符串文字没有必要按sizeof( int )对齐(此外,通常sizeof( int )可以大于或小于 4(。因此,该程序已经具有未定义的行为。

在这种情况下

*p != ''

sizeof( int )字节(不是单个字节(与整数常量进行比较 '' 。因此,当指针指向字符串内部时,比较将始终true(如果没有零字节,则指向字符串之外(。

顺便说一下还要注意,在 C sizeof( '' ) 中等于 sizeof( int ) .

当你将*p进行比较时,*p不是单个字符,而是一个(大概(四字节值(字符在比较之前被提升为整数(。
没有什么可以保证在字符串之后还有其他零字节:这是未定义的行为。

因此,您的循环会继续,直到偶然到达零整数。

使用 "%cn" 打印时,只考虑整数的下部字节;如果其值为零(不保证任何内容(,则不打印任何可见的内容,仅打印以下n

最新更新