strcpy (p, p+1) 做什么(p 是一个字符数组)?

What does strcpy (p, p+1) do (being p an array of chars)?

尽管我知道 strcpy 的作用,但我无法理解它在这种特定情况下的作用。我在哪里看到它说它将字符串 p 复制一个字符回来,但我不完全理解为什么来源是 p + 1。 我看到它的代码在这里:

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

#define MAXLINE 100000

int mgetline(char s[], int maxline);
int removetrail(char p[], int length);

int main(void){
    int len, lenr;
    char line[MAXLINE];

    while ((len = mgetline(line, MAXLINE)) > 0){
        if ((lenr = removetrail(line, len)) > 0)
            printf("%s", line);
    }
    return 0;
}

int mgetline(char s[], int maxline)
{
    int i, c;

    for (i = 0;(i < maxline) && ((c = getchar()) != EOF);++i){
        if (c == '\n'){
            s[i] = c;
            break;
        }
        else
            s[i] = c;
    }

    ++i;
    s[i] = '[=10=]';

    return i;
}

int removetrail(char p[], int length)
{
    int a;
    for (a = 0 ; ((p[a] == '\t') || (p[a] == ' ')) && a < length ;  length--)
        strcpy(p, p+1);
    for (a = length - 2 ; ((p[a] == '\t') || (p[a] == ' ')) && a > 0 ; --a)
        ;

    if ((p[a] != ' ') && (p[a] != '\t') && (a >= 0)){
        ++a;
        p[a] = '\n';
        ++a;
        p[a] = '[=10=]';
    }

    return a;
}

可能该代码的作者希望删除字符串的第一个字符。但这是一个 错误的 代码,因为源代码和目标代码不能重叠。

另一个问题是字符串长度是否为 0。

正确版本:

char *removeFirst(char *str)
{
    char *wrk = str;
    if(str && *str)
    {
        do
        {
            *str = *(str +1);
        }
        while(*str++);
    }
    return wrk;
}

char *ostrcpy(char *dest, const char *src)
{
    size_t len = strlen(src);

    memmove(dest, src, len + 1);
    return dest;
}


int main()
{
    char str[] = "hello";

    printf("%s\n", removeFirst(str));
    printf("%s\n", ostrcpy(str, str+1));
}