C语言 访问字符串元素混淆



我知道字符串元素的访问方式与其他数组类似。我使用 printf("%c",str[i]); 打印字符串中的每个字符。使用此printf("%c",str[0]+i)代码打印出字符串中的第一个字符,然后打印连续字符并在字符串长度的末尾停止。


我想知道为什么会这样?

#include<stdio.h>
#include<string.h>
int main()
{
    char *str= "string" ;
    int s = strlen(str) ;
    int i ;
    for (i=0;i<s;i++)
    {
      printf("%c",str[i]); //valid
    }
    for (i=0;i<s;i++)
    {
       printf("n%c",str[0]+i); //not valid
    }
    printf("nThe length of string : %dn ",s);
    return 0 ;
}

你可能想要

printf("%c",*(str+i))

而不是

printf("%c",str[0]+i)

使用 str[0]+i 时,i 将添加到str[0] 中。ASCII 表中表示的字符是连续的,将数字(例如 1)添加到字符(例如 's')会导致字符't',因为 t 紧随 ASCII 表中的s之后。

在此代码片段中,您不会递增数组索引,而是将整数"i"添加到位置"str[0]"字符的 ASCII 值中。因此,您将获得连续字符作为输出。

for (i=0;i<s;i++)
{
printf("n%c",str[0]+i); //not valid
}

这是输出:

字符串

s

t

u

v

w

x

字符串长度:6

第一种方法是打印字符串的正确方法。第二种方式,你说无效,实际上是这样做——

ascii 值 s[0](等于 115)+ i

ascii 值 's' + 1 = ascii 值 't' = 116, ascii 值 '

s'+2 = ascii 值 'u' =117 依此类推。

希望对您有所帮助!

for (i=0;i<s;i++)
{
printf("n%c",str[0]+i); //not valid
}

这里发生的事情是:

counter    command                output
i=0        print --> 115 + 0      s
i=1        print --> 115 + 1      t
...                               u
...
您将使用s[0] + i将整数

i添加到 ASCII 值 s 中,因此它会打印从 s 开始到字符串长度的字符。

最新更新