您好我需要编写一个使用过的定义函数,通过该函数我需要提取指定的字符数,虽然我能够做到这一点,但我有一个疑问,我没有得到预期的o / p。
我使用了以下代码,它给出了预期的o / p
#include <stdio.h>
int xleft(const char *s, char *t, int offset)
{
int i;
for(i=0;i<offset;++i)
{
*(t+i)=*(s+i); // t[i]=s[i] also worked which I guess is the
//syntactical sugar for it. Am I rt ?
}
t[i+1]='\0';
return 1;
}
int main()
{
char mess[]="Do not blame me, I never voted VP";
char newmess[7];
xleft(mess,newmess,6);
puts(newmess);
return 0;
}
但是当我编写像这样的代码时,我无法理解为什么我没有得到o / p
#include <stdio.h>
int xleft(const char *s,char *t, int offset)
{
int i;
for(i=0;i<offset;++i)
{
*t++=*s++;
}
t[i+1]='\0';
return 1;
}
int main()
{
char mess[]="Do not blame me, I never voted VP";
char newmess[7];
xleft(mess,newmess,6);
puts(newmess);
return 0;
}
答案 0 :(得分:4)
t [i] = s [i]也工作,我猜它是它的语法糖。 我是吗?
是的,你是对的s[i] = *(s+i);
在第二个代码片段中,您正在移动指针t,现在只需执行
*t = '\0';
而不是
t[i+1] = '\0'; /* Which is array out of bound access */
答案 1 :(得分:1)
*(t+i)=*(s+i); // t[i]=s[i] also worked which I guess is the
//syntactical sugar for it. Am I rt ?
确实你是。 C中的pointer[index]
相当于*(pointer + index)
。
但是,它与此不一样:*t++=*s++;
。在这里,您正在改变您的实际指针。因此,指针t
的新值将为t + i
。这就是为什么t[i + 1]
就t
的原始值而言变为*(t + i + i + 1)
,这绝对不是您想要的。
答案 2 :(得分:0)
在新代码t[i+1]
中,(大约)等同于旧代码中的(t+i)[i+1]
(或t[i + i + 1]
)。