Avatar billede koch Nybegynder
07. april 2005 - 18:15 Der er 24 kommentarer og
1 løsning

Sammenligne to strenge

Jeg vil gerne sammnenligne to tekststrenge(en funktion som svarer til strncmp();) og har indtil videre dette som ikke fungerer:

int  sammenlign_nchar(const char *s1, const char *s2, int n){       
    n=2;//evt. indtastning fra brugeren 
    int comp_res;
    s1="teststreng";
    s2="strengtest";

if(*s1[n] == *s2[n]){//linie 12
og så noget mere...

}

Ideen er, at *s1 og *s2 peger på s1 og s2 og jeg kan tilgå disse arrays med *s1[n], hvor n er antallet af bogstaver der skal sammenlignes.


Jeg får at vide at der i linie 12 er invalid type of unary *

Jeg er ved at lære C programmering, så jeg vil helst ikke have funktionen foræret!
Avatar billede avarjo Nybegynder
07. april 2005 - 18:33 #1
Sammenlign 2 variable i een if-sætning med == (IKKE på hver side af == den er HELT gal!)
Avatar billede arne_v Ekspert
07. april 2005 - 18:42 #2
du skal vel have en

for(i=0;i<n;i++)

og testet skal være

if(s1[i] == s2[i])
Avatar billede koch Nybegynder
07. april 2005 - 19:03 #3
Hvis jeg gerne vil bruge pointere, skal der i if sætningen så ikke stå *s1[i] og i det hele taget igennem funktionen?

Jeg har følgende:
Jeg ved godt at det ikke hænger helt sammen nu, sådan som jeg har brugt pointere. Men opgaven vil jeg meget gerne løse, så jeg til sidst i løkken 'flytter' pointeren med *s1++;

Jeg tilføjer først til sidst at det skrives ud, så det ser vi lige bort fra...


int  sammenlign_nchar(const char *s1, const char *s2, int n){       
    int i, comp_res;

    for ( i = 0; i <= n; i++){
        if(s1[n] == s2[n]){
                comp_res=0;
                }
               
        else if(s1[i] < s2[i]){
                comp_res=-1;                                         
                }
               
        else if(s1[i] > s2[i]){
                comp_res=1;                                         
                }
   
    *s1++;                                               
    }

}
Avatar billede arne_v Ekspert
07. april 2005 - 19:04 #4
med:

char *s

skal du bruge enten

*s

eller

s[i]

men ikke

*s[i]
Avatar billede koch Nybegynder
07. april 2005 - 19:12 #5
Havde vist n i stedet for i ovenfor også!

Giver følgende ikke mening

int  sammenlign_nchar(const char *s1, const char *s2, int n){       
    int i, comp_res;
    for ( i = 0; i <= n; i++){
        if(*s1 == *s2){
                comp_res=0;
                }
               
        else if(*s1 < *s2){
                comp_res=-1;                                         
                }
               
        else if(*s1 > *s2){
                comp_res=1;                                         
                }
   
    *s1++;                                               
    *s2++;
    }

}

så løber jeg vel strengene s1 og s2 igennem med pointerne *s1 og *s2
Avatar billede arne_v Ekspert
07. april 2005 - 19:14 #6
i < n ikke i <= n bår du starter i 0
Avatar billede arne_v Ekspert
07. april 2005 - 19:14 #7
du skal returnere lige så snart du har en forskel
Avatar billede arne_v Ekspert
07. april 2005 - 19:15 #8
*s1++;                                             
    *s2++;

skal vel være

 
    s1++;                                             
    s2++;
Avatar billede koch Nybegynder
07. april 2005 - 19:19 #9
Altså return comp_res efter hver if-del, eks.

  if(*s1 == *s2){
                comp_res=0;
return comp_res;
                }

skal jeg sætte en break ind efter return, så funktionen ikke kører videre eller sørger return for det?
Avatar billede arne_v Ekspert
07. april 2005 - 19:26 #10
Kun return hvis de er forskellige - ikke hvis de er ens

return returnerer fra funktionen med det samme
Avatar billede koch Nybegynder
07. april 2005 - 19:32 #11
lige udenfor for-løkken har jeg tilføjet

    printf("\n%s", comp_res);

Er dette så ikke måden at kalde den på


    const char *s1="test";
    const char *s2="hest";
    int  n=2;
    sammenlign_nchar(s1, s2, n);
Avatar billede arne_v Ekspert
07. april 2005 - 19:52 #12
det ser rigtigt ud
Avatar billede koch Nybegynder
08. april 2005 - 00:10 #13
Der sker absolut intet i programmet... Jeg kan trykke på en tast for at afslutte og det er det!
Avatar billede koch Nybegynder
08. april 2005 - 00:15 #14
Eller den skriver (null) når de to strenge er ens, men ellers skrives der ingen ting!
Avatar billede arne_v Ekspert
08. april 2005 - 07:45 #15
Prøv lige og post hele koden
Avatar billede koch Nybegynder
08. april 2005 - 08:11 #16
#include <stdio.h>
#include <stdlib.h>


int  sammenlign_nchar(const char *s1, const char *s2, int n){       
    int i, comp_res;
  //&& *s1 != '\0'
    for ( i = 0; i < n; i++){
        if(*s1 == *s2){
                comp_res = 0;
                }
               
        else if(*s1 < *s2){
                comp_res = -1;                                         
                return comp_res;
                }
               
        else if(*s1 > *s2){
                comp_res = 1;   
                return comp_res;                                     
                }
   
    *s1++;                                               
    *s2++;
    }
   
    printf("\n%s", comp_res);

}


int main(int argc, char *argv[])
{
    const char *s1="test";
    const char *s2="test";
    int  n=2;
    sammenlign_nchar(s1, s2, n);
 
  system("PAUSE");   
  return 0;
}
Avatar billede arne_v Ekspert
08. april 2005 - 08:32 #17
Prøv lige og erstat:

printf("\n%s", comp_res);

med:

comp_res = 0;
printf("%d\n", comp_res);
Avatar billede arne_v Ekspert
08. april 2005 - 08:50 #18
comp_res = 0;
printf("%d\n", comp_res);
return comp_res;
Avatar billede koch Nybegynder
08. april 2005 - 10:57 #19
så skriver dden 0
Avatar billede koch Nybegynder
08. april 2005 - 11:05 #20
Den skriver også 0 når jeg skriver:

printf("%d\n", comp_res);

og strengene er ens, men når de ikke er ens skrives den ingenting!
Avatar billede arne_v Ekspert
08. april 2005 - 11:54 #21
selvfølgelig

fordi der er jo ikke en printf før de return's
Avatar billede koch Nybegynder
08. april 2005 - 14:38 #22
Helt sikkert, det virker, kanon :)

For lige at få det helt på plads.
hvorfor er det man skriver return comp_res; og ikke bare return. Jeg tænker på det som om at den returnerer værdien af comp_res, men den sørger vel bare for at den returnerer fra funktionen?

Du smider selvfølgelig bare et svar.
Avatar billede arne_v Ekspert
08. april 2005 - 14:40 #23
netop fordi du skal returne en værdi - funktionen returnerer int ikke void
Avatar billede arne_v Ekspert
08. april 2005 - 14:40 #24
og svar
Avatar billede koch Nybegynder
08. april 2005 - 14:42 #25
aha... Mange tak for rigtig god hjælp.
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
Kategori
Kurser inden for grundlæggende programmering

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