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
Annonceindlæg fra Cepheo
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 } }
Takker. Jeg er rimelig noob til C++, så vil du ikke lave et eks. som f.eks. omdanner kat til hund?
#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");
Der får jeg altså fejl, i linje 12 ( tmp = malloc(strlen(s)+1); ) ...og 40 ( replace(line, "kat", "hund"); )
#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
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);
Makes sense. De compilere jeg har brugt har bare "tilfældigvis" ikke givet warnings på det.
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*'
06. juni 2003 - 15:52
#10
Som jeg skrev tidligere! tmp = (char*)malloc(strlen(s)+1);
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.
06. juni 2003 - 16:04
#12
svar
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");
06. juni 2003 - 16:39
#14
Hvilken compiler bruger du og hvordan kører du programmet ?
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; }
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.
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..
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.
06. juni 2003 - 16:52
#19
Prøv og åben et permanent kommando vindue (DOS box) og kør programmet deri.
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.
06. juni 2003 - 17:37
#21
Har fundet ud af det.
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(
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.
Kurser inden for grundlæggende programmering