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

问题描述 投票:0回答:1

尽管我知道在这个特定情况下我无法理解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] = '\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;
}
c strcpy
1个回答
0
投票

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

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

正确的版本:

char *removeFirst(char *str)
{
    char *wrk = str;
    if(str && *str)
    {
        do
        {
            int ch = *str;
            *str = *(str +1);
            *(str+1) = ch;
        }
        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));
}


© www.soinside.com 2019 - 2024. All rights reserved.