Avatar billede ninachristensen Nybegynder
08. marts 2002 - 20:38 Der er 6 kommentarer og
1 løsning

lave dette til void stringcat(char[], char[])

Hej med jer,
Er der nogle der kan hjaelpe mig med dette? Jeg skal samle functioner:
int strlen( const char str[] );
bool stringcat(char str_a[], const char str_b[], int a_len);

i EN function:
void stringcat(char[],char[]);
de system-definerede functioner strlen, strcmp og strcpy maa IKKE benyttes.
Jeg har sat pointene til 100, da jeg skal aflevere snarest muligt - helst igaar:)
Nedenfor er programmet.

Paa forhaand tak!





//function protypes
int strlen( const char str[] );
bool stringcat(char str_a[], const char str_b[], int a_len);


void main()
{
    // variables used
    char string_a[128] = "Cheese cake";
    char string_b[128] = " is good!";

    cout << "str a: " << string_a << endl;
    cout << "str b: " << string_b << endl;

    //funtion call in the if statement for function stringcat
    if( stringcat( string_a, string_b, sizeof(string_a) ) )
    {
        cout << "stringcat a: " << string_a << endl;
       
    }
    else
    {
        cout << "stringcat: failed" << endl;
    }

}

// has to be NULL terminated
int strlen( const char str[] )
{
    int i=0;

    while( true )
    {
        //test if this element is a NULL termination
        if( str[i] == '\0' )
        {

            // size without NULL termination
            return i;
        }

        i++;
    }
}

bool stringcat( char str_a[], const char str_b[], int a_len )
{
    //The lenght of a minus NULL termination
    int a_size = strlen( str_a );

    //The lenght of b minus NULL termination
    int b_size = strlen( str_b );

    //Total lenght of both strings+ space for NULL termination
    int total = a_size + b_size + 1;
   
    //is there space enough for both strings + NULL
    //termination in string a?
    if( total > a_len )
    {
        // not enough space
        return false;
    }

    for( int i=0; i<b_size; i++ )
    {
        //put b into a at the first empty spot in a's string
        str_a[a_size+i] = str_b[i];
    }
    // terminate string a right after string b
    str_a[a_size+b_size+1] = '\0';
   
    return true;
}
Avatar billede soreno Praktikant
08. marts 2002 - 21:59 #1
prøv:
#include <iostream>

using namespace std;

void stringcat( char str_a[], const char str_b[] );

int main(int argc, char **argv)
{
    // variables used
    char string_a[128] = "Cheese cake";
    char string_b[128] = " is good!";

    cout << "str a: " << string_a << endl;
    cout << "str b: " << string_b << endl;

    //funtion call in the if statement for function stringcat
    stringcat( string_a, string_b );
        cout << "stringcat a: " << string_a << endl;

    return 0;
}

void stringcat( char str_a[], const char str_b[] )
{
    int a_size = 0;
    while( str_a[a_size] != '\0' )
    {
        a_size++;
    }   

    int b_size = 0;
    while( str_b[b_size] != '\0' )
    {
        b_size++;
    }   

    for( int i=0; i<b_size; i++ )
    {
        str_a[a_size+i] = str_b[i];
    }
}
Avatar billede ninachristensen Nybegynder
08. marts 2002 - 22:45 #2
Hej Soreno,
Jeg er ikke meget for at afvise dit svar og jeg vil meget gerne give dig point. Jeg har et problem med:
int main(int argc, char **argv),da jeg ikke har laert at bruge det (har kun programmeret siden januar). Hvorfor bruger du **argv?? - programmet koerer med *argv. Er det muligt at du kan give en lille forklaring?
Tak for hjaelpen!
Avatar billede soreno Praktikant
08. marts 2002 - 22:51 #3
du kan bare ændre det til:
void main()

og så fjerne "return 0;" nederst i main metoden.

int argc - er argument count
char **args - er arrayet hvori argumenterne (parametrene) til programmet gemmes.

eks:
mitProgra.exe hello world

for at få fat i "hello" og "world" kan man bruge de variabler..
for(int i=0;i<argc;++i)
  cout << argv[i] << endl;
ville udskrive:
hello
world
Avatar billede soreno Praktikant
08. marts 2002 - 22:53 #4
rettelse det ville udskrive:
stien/til/mitProgram/mitProgram.exe
hello
world
Avatar billede ninachristensen Nybegynder
08. marts 2002 - 23:11 #5
Hej soreno,
Jeg er meget imponeret over hvor hurtigt du svarer og at det er saa brugbart som det er. Du faar meget veltjent pointene (haaber det koerer automatisk naar jeg accepter svaret)
Hvis du har tid, vil jeg tillade mig at spoerge til funktionen - jeg er jo ret ny i C++ saa det virker formentlig som nogle temmelig lette spoergsmaal.

Har jeg forstaaet det ret, at dine while loops tester om elementer er en nulterminering og at for loopen propper b ind paa den foerste ledige plads paa a strengen?  Hvordan lukker den efter det hele er samlet paa a strengen, jeg troede at den skulle lukke med en NULL streng?
Avatar billede soreno Praktikant
08. marts 2002 - 23:31 #6
while løkkerne tæller antallet af tegn (a_size) før arrayet når et \0 tegn.
i eksemplet er "Cheese cake" 11 tegn langt + 1 tegn til \0

for løkken sætter indholdet af str_b[i] på str_a[a_size+i], dvs. at \0 i str_a bliver overskrevet med første tegn i " is good!"

jeg prøvede at sætte følgende ind som det sidste i stringcat(..):
    a_size = 0;
    while( str_a[a_size] != '\0' )
    {
    cout << str_a[a_size];
        a_size++;
    }   
    cout << endl;

og det fungerede uden problemet. men hvordan str_a er blevet \0 termineret, det aner jeg faktisk ikke ? (måske er der en anden der kan uddybe ?)

i det eksempel du postede blev str_a jo netop \0 termineret:
str_a[a_size+b_size+1] = '\0';
men jeg prøvede begge dele, og det var ens, og så tænkte jeg at det var unødvendig fyld, og fjernede det.. det er måske ikke i overensstemmelse med god programmeringsskik, så sprøgsmålet er om du ikke skulle tage at sætte det ind igen.. ? (det kunne jo være at personen der skal rette din opgave ikke er tilfreds hvis ikke du manuelt \0 terminere arrayet)
Avatar billede ninachristensen Nybegynder
08. marts 2002 - 23:37 #7
jeg siger mange tak for hjaelpen :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester