Что делает strcpy (p, p + 1) (будучи p массивом символов)? - PullRequest
0 голосов
/ 30 марта 2020

Несмотря на то, что я знаю, что делает strcpy, я не смог понять, что он сделал в этом конкретном c случае. Когда я увидел это, он сказал, что скопировал строку 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] = '\0';

    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] = '\0';
    }

    return a;
}

1 Ответ

0 голосов
/ 30 марта 2020

Вероятно, автору этого codewanted действительно удаляют первый символ строки. Но это неправильный код, поскольку источник и назначение не должны перекрываться.

Другая проблема заключается в том, что длина строки равна 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));
}


...