Я пытаюсь изменить строку навсегда, но этот код не делает этого - PullRequest
0 голосов
/ 07 апреля 2020
    #include<stdio.h>
    #include<conio.h> //**Just To Add getch() function**
    int length(char *p){
        int i; //**I know That these variable are not the same as they are in other function**
        for(i=0;*(p+i)!='\0';i++);
        return i;
    }
    void strrev(char *p){
        int i,len;
        len=length(p);    
        char cpy[len]; //**Already Tried to change it to some fixed value**
        for(i=0;i<len;i++){
            cpy[i]=*(p+len-i);
        }
        for(i=0;i<len;i++){
            *(p+i)=cpy[i];
        }
    }
    int main(){
        char str[20]="computer";
        strrev(str);
        printf("%s",str);
        getch(); //**to Stop The Screen**
        return 0;
    }

Я пытался изменить размер массива на фиксированное значение, я также пытался изменить переменную, но в моем синтаксисе нет ошибок.

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

По рекомендации @Yunnosch, вот мой комментарий в качестве ответа.

В вашей функции strrev вы перебираете всю строку, то есть итерации для i от нуля до len / 2, вы правильно захватить символы, но оставшиеся итерации просто отменить это снова.

Таким образом, просто итерации от нуля до len >> 1. Сдвиг битов обеспечивает целочисленное деление.

void strrev(char* const str)
{
   const size_t len = strlen(str);
   for(size_t i = 0; i < (len >> 1u); ++i)
   {
     const size_t j = len - 1u - i;
     char c = str[i];
     str[i] = str[j];
     str[j] = c;
   }
}
0 голосов
/ 07 апреля 2020

использование этого cpy[i]=*(p+len-i); означает, что вы помещаете \0 терминатор в начало строки cpy. в этом случае обе строки будут начинаться с \0, поэтому printf ничего не будет делать.

, поэтому измените cpy[i]=*(p+len-i); на cpy[i] = *(p + len - i-1);.

...