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

Odpowiedz Nowy wątek
2013-08-30 12:22
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?

edytowany 2x, ostatnio: madmike, 2013-08-30 16:01

Pozostało 580 znaków

2013-08-30 13:03
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;
}

Znajdź mnie na Wykopie!

Nie jestem niczyim murzynem, żeby robić za Ciebie program. Nawet nie próbuj pisać na PW! :D
char* strncpy(char* to, const char* from, const unsigned count); - n0name_l 2013-08-30 13:43
minus za strlen() w warunku pętli co wprost prowadzi do kwadratowej złożoności. @n0name_l a po kiego count jest z const'em? - _13th_Dragon 2013-08-30 15:53
Zeby bylo ladnie ofc. - n0name_l 2013-08-30 16:11
@_13th_Dragon who cares. Można przechować długość w zmiennej. - Japer 2013-08-30 16:21
Owszem, ale dając przykład początkującemu nie zrobiłeś tego. - _13th_Dragon 2013-08-30 16:22
Jeżeli rozmiar to będzie mniejszy od from to count nie pomoże i się posypie. - byku_guzio 2013-08-31 13:09

Pozostało 580 znaków

2013-08-30 13:08
0

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

Pozostało 580 znaków

2013-08-30 13:14
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;


Znajdź mnie na Wykopie!

Nie jestem niczyim murzynem, żeby robić za Ciebie program. Nawet nie próbuj pisać na PW! :D
edytowany 3x, ostatnio: Japer, 2013-08-30 13:21

Pozostało 580 znaków

2013-08-30 13:21
0

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

Pozostało 580 znaków

2013-08-30 13:24
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


Znajdź mnie na Wykopie!

Nie jestem niczyim murzynem, żeby robić za Ciebie program. Nawet nie próbuj pisać na PW! :D

Pozostało 580 znaków

2013-08-30 16:00
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;
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2013-08-31 09:31
0

[code]
#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;
}
[/code]
Funkcji malloc() jeszcze nie ma na tym etapie
A tu są błędy?

Po kiego ci dwa liczniki i, j skoro cały czas będą mieć tą samą wartość. Po kiego ci break skoro da się to wstawić w warunek while, ba będzie poprawniej, bo jak ktoś poda n=0 lub ujemną to ... Drugiej pętli strncpy z całą pewnością nie robi. - _13th_Dragon 2013-08-31 10:28
Druga pętla wstawia znaczniki zerowe a "i" i "j" eliminuje pomyłkę - xpeye 2013-08-31 11:38
Druga pętla wstawia znaczniki zerowe, jesli n jest większa niż j - aby te liczby wyróżniać ze sobą - xpeye 2013-08-31 12:15
Jaką to pomyłkę eliminują dwie zmienne? Ewidentną pomyłką jest nieużywanie logiki podczas programowania. strncpy kopiuje tylko jeden znak zakończenia i tylko wtedy gdy jest na to miejsce (ma być mniejsze niż 'n'). Jak masz powtórzyć strncpy to powtórz a nie wymyślaj własnych reguł działania. - _13th_Dragon 2013-08-31 12:25

Pozostało 580 znaków

2013-08-31 12:46
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;
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2013-09-01 11:09
0

Według tego co tu pisze http://pl.wikibooks.org/wiki/C/strncpy to byłoby dobre
[code]
#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;
}
[/code]
?

Pokaż pozostałe 6 komentarzy
I tak ma błąd, bo jeśli wywoła: 'char Pojemnik[11]; Kopiuj( "1234567890", "0987654321", 10 )' to zobacz co wywali mu: 'cout<<Pojemnik'; Nie zakończy go zerem. - Ola Nordmann 2013-09-04 13:25
Co za głupi standard ^^ - Ola Nordmann 2013-09-04 19:28
Nie jest głupi, tylko służy innym celom niż myślisz. - _13th_Dragon 2013-09-04 20:24
głupota to określenie względne. - Ola Nordmann 2013-09-05 18:05

Pozostało 580 znaków

2013-09-02 18:21
0

Nie wiem, czy dobrze napisałem też to zadanie:
„Napisz funkcję, która pobiera łańcuch i usuwa z niego odstępy. Wypróbuj ją w prostym programie, który odczytuje wiersze za pomocą pętli i kończy działanie po wpisaniu pustej linii. Program powinien stosować funkcję dla każdego wiersza.”

dobrze napisałem
[code]
#include <stdio.h>
char odstepy(char lancuch);
int main(void)
{
char dane[120];
printf("Cwiczenie 11.9 w jezyku C - autor: xpeye\n\n");
do
{
printf("Podaj lancuch: ");
gets(dane);
printf("Oto lancuch: %s\n", odstepy(dane));
}while(odstepy(dane)!=NULL);
printf("\nKoniec\n");
getchar();
return 0;
}

char odstepy(char lancuch)
{
int i=0, j=0;
while(lancuch[j]!='\0')
{
if(lancuch[j]==' ')
j++;
lancuch[i]=lancuch[j];
i++;
j++;
}
lancuch[i]=lancuch[j];
if(lancuch[0]==0)
return NULL;
else
return lancuch;
}
[/code]
?

edytowany 1x, ostatnio: xpeye, 2013-09-02 18:44

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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