Avatar billede snuseren.dk Nybegynder
04. juni 2003 - 16:50 Der er 21 kommentarer og
2 løsninger

Replace ord i hele sætninger, til andre ord..

Hey

Hvordan laver jeg en replace funk. i c++ console mode, der replacer ord som jeg replacer, til andre ord, i hele sætninger? (I en char variabel..)

MVH
ANders
Avatar billede arne_v Ekspert
04. juni 2003 - 17:00 #1
Jeg kan forestille mig 2 approaches:

1)  du laver en replace funktion a la
      void replace(char *s, char *fnd, char *rpl)
    [jeg har tidliger epostet noget kode]

    du kalder den funktion med alle substitiútionerne:
      replace(line, "January", "januar");
      ...
      replace(line, "December", "december");
    hvis nu du ville skifte fra UK tiL DK måneder.

2)  du laver en hash tabel med ord og erstatninger

    så laver du en logik som:

    while more words in string {
        get next word from string
        if word in hash table then {
            output replacement
        } else {
            output word
        }
    }
Avatar billede snuseren.dk Nybegynder
04. juni 2003 - 17:02 #2
Takker. Jeg er rimelig noob til C++, så vil du ikke lave et eks. som f.eks. omdanner kat til hund?
Avatar billede arne_v Ekspert
04. juni 2003 - 17:30 #3
#include <stdlib.h>
#include <string.h>

void replace(char *s,char *s1,char *s2)
{
  int i,j;
  char *tmp;
  tmp = malloc(strlen(s)+1);
  strcpy(tmp,s);
  i = 0;
  j = 0;
  while(i<strlen(tmp)) {
      if(strncmp(tmp+i,s1,strlen(s1))==0) {
        strcpy(s+j,s2);
        i=i+strlen(s1);
        j=j+strlen(s2);
      } else {
        s[j]=tmp[i];
        i++;
        j++;
      }
  }
  s[j] = '\0';
  free(tmp);
  return;
}

og:

replace(line, "kat", "hund");
replace(line, "mis", "vovse");
Avatar billede snuseren.dk Nybegynder
04. juni 2003 - 18:58 #4
Der får jeg altså fejl, i linje 12 (  tmp = malloc(strlen(s)+1); )

...og 40 (  replace(line, "kat", "hund"); )
Avatar billede arne_v Ekspert
04. juni 2003 - 19:04 #5
Hvilken fejl ?
Avatar billede arne_v Ekspert
04. juni 2003 - 19:07 #6
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void replace(char *s,char *s1,char *s2)
{
  int i,j;
  char *tmp;
  tmp = malloc(strlen(s)+1);
  strcpy(tmp,s);
  i = 0;
  j = 0;
  while(i<strlen(tmp)) {
      if(strncmp(tmp+i,s1,strlen(s1))==0) {
        strcpy(s+j,s2);
        i=i+strlen(s1);
        j=j+strlen(s2);
      } else {
        s[j]=tmp[i];
        i++;
        j++;
      }
  }
  s[j] = '\0';
  free(tmp);
  return;
}

int main()
{
  char line[100];
  printf("Enter: ");
  gets(line);
  replace(line, "kat", "hund");
  replace(line, "mis", "vovse");
  printf("%s\n",line);
  return 0;
}

C:\>repl
Enter: Min kat er en sod lille mis
Min hund er en sod lille vovse
Avatar billede tam Nybegynder
05. juni 2003 - 00:23 #7
Nu ved jeg ikke hvilken compiler du bruger, men som regel skal du caste malloc til en char*, da malloc returnerer en void*

tmp = (char*)malloc(strlen(s)+1);
Avatar billede arne_v Ekspert
05. juni 2003 - 02:18 #8
Makes sense.

De compilere jeg har brugt har bare "tilfældigvis" ikke givet warnings på det.
Avatar billede snuseren.dk Nybegynder
06. juni 2003 - 15:49 #9
Arne ->> Jeg får fejl i linie 9. tmp = malloc(strlen(s)+1);

Fejlmeddelelse:

9 C:\Documents and Settings\Administrator\My Documents\CPP\Replace\main.cpp
invalid conversion from `void*' to `char*'
Avatar billede tam Nybegynder
06. juni 2003 - 15:52 #10
Som jeg skrev tidligere!

tmp = (char*)malloc(strlen(s)+1);
Avatar billede snuseren.dk Nybegynder
06. juni 2003 - 15:57 #11
Sorry, det overså jeg! Men nu virker det :o) Tak til jer begge!

Arne, kan du ik lægge et svar, så deler jeg pointene.
Avatar billede arne_v Ekspert
06. juni 2003 - 16:04 #12
svar
Avatar billede snuseren.dk Nybegynder
06. juni 2003 - 16:36 #13
Jeg har lavet sådan en menu, hvor man skal trykke a), b) eller c. Men hvis man f.eks. trykker c, kommer der rigtigt nok det der skal stå, men nedenunder står der "Tryk på en tast for at fortsætte", så man kan ikke gøre andet end trykke på en tast, og så lukker programmet ned. Jeg har prøvet system("PAUSE");
Avatar billede arne_v Ekspert
06. juni 2003 - 16:39 #14
Hvilken compiler bruger du og hvordan kører du programmet ?
Avatar billede snuseren.dk Nybegynder
06. juni 2003 - 16:41 #15
Jeg kører programmet i console mode, og bruger dev-cpp.

Her er koden:

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

using namespace std;

void replace(char *s,char *s1,char *s2)
{
  int i,j;
  char *tmp;
  tmp = (char*)malloc(strlen(s)+1);
  strcpy(tmp,s);
  i = 0;
  j = 0;
  while(i<strlen(tmp)) {
      if(strncmp(tmp+i,s1,strlen(s1))==0) {
        strcpy(s+j,s2);
        i=i+strlen(s1);
        j=j+strlen(s2);
      } else {
        s[j]=tmp[i];
        i++;
        j++;
      }
  }
  s[j] = '\0';
  free(tmp);
  return;
}

int main()
{
  char valg;

  cout << "Hvad vil du foretage dig:";
  cout << "\n\n";
  cout << "    a) Overs\x91tte til kodesprog\n";
  cout << "    b) Overs\x91tte kodesprog til bogstaver\n";
  cout << "    c) Hj\x91lp\n";
 
  cin >> valg;
 
  if (valg == 'a') {
  system("cls"); //sletter console skærmens indhold.
  char line[100];
  printf("Enter: ");
  gets(line);
  replace(line, "a", "!");
  replace(line, "b", "#");
  replace(line, "c", "¤");
  replace(line, "d", "%");
  replace(line, "e", "&");
  replace(line, "f", "/");
  replace(line, "g", "(");
  replace(line, "h", ")");
  replace(line, "i", "=");
  replace(line, "j", "+");
  replace(line, "k", "?");
  replace(line, "l", "´");
  replace(line, "m", "`");
  replace(line, "n", "|");
  replace(line, "o", "@");
  replace(line, "p", "£");
  replace(line, "q", "$");
  replace(line, "r", "{");
  replace(line, "s", "[");
  replace(line, "t", "]");
  replace(line, "u", "}");
  replace(line, "v", "¨");
  replace(line, "w", "^");
  replace(line, "x", "~");
  replace(line, "y", "'");
  replace(line, "z", "*");
  replace(line, " ", "<");
  printf("%s\n",line);
  system("PAUSE");
  return 0;
}   
  system("PAUSE");
  return 0;
}
Avatar billede arne_v Ekspert
06. juni 2003 - 16:47 #16
system("PAUSE") har deb effekt at man skal taste et eller andet
for at fortsætte.

Hvis du sletter den (dem), så forsvinder det.

De bruge softe i.f.m. dev-cpp fordi så kan man se console
output når man kører programmet fra selve dev-cpp.
Avatar billede snuseren.dk Nybegynder
06. juni 2003 - 16:50 #17
Men hvis jeg sletter dem, når jeg nærmest ikke at se vinduet efter jeg har tastet a) b) eller c), for så forsvinder det bare..
Avatar billede snuseren.dk Nybegynder
06. juni 2003 - 16:51 #18
Men man skal osse indtaste noget... Hvis man vælger a), skal man indtaste sådan en sætning.
Avatar billede arne_v Ekspert
06. juni 2003 - 16:52 #19
Prøv og åben et permanent kommando vindue (DOS box) og kør programmet deri.
Avatar billede snuseren.dk Nybegynder
06. juni 2003 - 17:03 #20
Det virker ik, men jeg vil gerne have det sådan at man ikke skal til at åbne en permanent dos box, for at køre det. Hvis du får det til at virke, skal du søføli nok få lidt flere points.
Avatar billede snuseren.dk Nybegynder
06. juni 2003 - 17:37 #21
Har fundet ud af det.
Avatar billede snuseren.dk Nybegynder
06. juni 2003 - 17:39 #22
Har ik fundet ud af det alligevel, da jeg fandt ud af at cin kun kan indeholde et ord ad gangen :o(
Avatar billede arne_v Ekspert
06. juni 2003 - 18:11 #23
Jeg måtte lige tage en telefon konference.

Jeg kan se at du har oprettet et separat spørgsmål.

Jeg kigger lige på det.
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