Własna wersja funkcjj strncpy() - nie wiem, czy dobrze napisałem

0

Chcę się upewnić, czy dobrze rozwiązałem. Oto zadanie:
Funkcja strncpy(s1,s2,n) kopiuje z s2 do s1 dokładnie n znaków, w razie potrzeby skracając łańcuch s2 lub dodając do niego znaki zerowe. Łańcuch wynikowy może nie kończyć się znakiem zerowym, jeśli długość s2 wynosi n lub więcej. Wartością zwracaną jest s1. Napisz własną wersję tej funkcji

A oto kod:

#include <stdio.h>
#include <string.h>
char *kopiuj(char *lancuch1, char *lancuch2, int n);
int main(void)
{
    char dane1[50], dane2[50];
    int a;
    printf("Cwiczenie 11.6 w jezyku C - autor: xpeye\n\n");
    printf("Podaj pierwszy lancuch: ");
    gets(dane1);
    printf("Podaj drugi lancuch: ");
    gets(dane2);
    printf("Podaj ilosc znakow do skopiowania z drugiego lancucha do pierwszego: ");
    scanf("%d", &a);
    printf("Oto pierwszy lancuch po skopiowaniu:\n%s", kopiuj(dane1, dane2, a));
    getchar();
    getchar();
    return 0;
}

char *kopiuj(char *lancuch1, char *lancuch2, int n)
{
    int i=0, j=0;
    if(strlen(lancuch2)>n)
    *(lancuch2+n)='\0';
    else if(strlen(lancuch2)<n)
    {
        j=strlen(lancuch2);
        do
        {
            lancuch2[j]='\0';
            j++;
        } while(j<=n);
    }
    j=0;
    do
    {
        lancuch1[i]=lancuch2[j];
        i++;
        j++;
    } while(lancuch2[j-1]!='\0');
    return lancuch1;
}

I jak?

1

Twój kod jest zbyt zagmatwany. Czy nie lepiej zrobić tak:

#include <stdio.h>
#include <stdlib.h>

char* strncpy(char to[], char from[], unsigned count);
unsigned strlen(char str[]);

int main()
{
    char a[64];
    char b[64] = "to jest testowy ciag";

    strncpy(a, b, 2);

    printf(a);
    return 0;
}

char* strncpy(char to[], char from[], unsigned count)
{
    unsigned i;
    for(i = 0; i < strlen(from); i++)
        *(to + i) = i < count ? *(from + i) : 0;
    return to;
}

unsigned strlen(char str[])
{
    unsigned i;
    for(i = 0; str[i]; i++);
    return i;
}
0

Czyli moja jest zła, czy tylko o wygląd chodzi?

0

Ten kod jest pogmatwany, że istnieje ryzyko błędu. W moim rozwiązaniu użyłem arytmetyki wskaźników, która jest bardzo fajnym rozwiązaniem. Zgodnie z zadaniem kopiuje znaki po podaniu count a gdy i będzie równe count to dopełnia znakami zerowymi (zgodnie z długością stringa źródłowego). Można dorobić jeszcze zabezpieczenia (ten kod był pisany na prędce) przeciw przekraczaniu indeksu.

Linijka kopiowania to to samo co:
to[i] = i < count ? from[i] : 0;

0

Wiem, że Twój kod jest łatwiejszy,tylko mi chodzi oto, czy mój realizuje w 100% treść zadania?

1

Twoja funkcja narusza ciąg źródłowy - takiego czegoś nie powinno być. Podczas próby dania większej liczby znaków następuje błąd segmentacji pamięci. Funkcja jest dziurawa :P

4

Strasznie sobie życie utrudniacie:

char *strncpy(char *dst,const char *src,unsigned count)
  {
   for(char *tmp=dst;(count)&&((*(tmp++)=*(src++))!='\0');--count) {}
   return dst;
  }
0


#include <stdio.h>
#include <string.h>
char kopiuj(char lancuch1, const char *lancuch2, int n);
int main(void)
{
char dane1[50], dane2[50];
int a;
printf("Cwiczenie 11.6 w jezyku C - autor: xpeye\n\n");
printf("Podaj pierwszy lancuch: ");
gets(dane1);
printf("Podaj drugi lancuch: ");
gets(dane2);
printf("Podaj ilosc znakow do skopiowania z drugiego lancucha do pierwszego: ");
scanf("%d", &a);
printf("Oto pierwszy lancuch po skopiowaniu:\n%s", kopiuj(dane1, dane2, a));
getchar();
getchar();
return 0;
}

char kopiuj(char lancuch1, const char *lancuch2, int n)
{
int i=0, j=0;
while(lancuch2[j]!='\0')
{
lancuch1[i]=lancuch2[j];
i++;
j++;
if (j==n)
break;
}
while(i<=n)
{
lancuch1[i]='\0';
i++;
}
return lancuch1;
}

Funkcji malloc() jeszcze nie ma na tym etapie
A tu są błędy?

0

Jeżeli koniecznie chcesz zrobić to na indeksach to zrób to po ludzku:

char *strncpy(char *dst,const char *src,unsigned count)
  {
   for(unsigned i=0;(i<count)&&((tmp[i]=src[i])!='\0');++i) {}
   return dst;
  }
0

Według tego co tu pisze http://pl.wikibooks.org/wiki/C/strncpy to byłoby dobre

#include <stdio.h>
char kopiuj(char lancuch1, const char *lancuch2, int n);
int main(void)
{
char dane1[50], dane2[50];
int a;
printf("Cwiczenie 11.6 w jezyku C - autor: xpeye\n\n");
printf("Podaj pierwszy lancuch: ");
gets(dane1);
printf("Podaj drugi lancuch: ");
gets(dane2);
printf("Podaj ilosc znakow do skopiowania z drugiego lancucha do pierwszego: ");
scanf("%d", &a);
printf("Oto pierwszy lancuch po skopiowaniu:\n%s", kopiuj(dane1, dane2, a));
getchar();
getchar();
return 0;
}

char kopiuj(char lancuch1, const char *lancuch2, int n)
{
int i=0;
while(lancuch2[i]!='\0' && i<n)
{
lancuch1[i]=lancuch2[i];
i++;
}
while(i<n)
{
lancuch1[i]='\0';
i++;
}
return lancuch1;
}

?

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0