13. maj 2003 - 23:01
Der er
18 kommentarer og 1 løsning
text bliver "siddende" i min variabel..
her er min funktion..: int write_emote(int fd, char text[3000]) { char msg[5000]; char emote[3000]; int len; strcpy(emote, text); replace(emote, "\n\r", ""); replace(emote, "\r", ""); replace(emote, "\n", ""); sprintf(msg, "%s!.!<font color=666666><i>%s %s</i>\n\r", user[fd].ikon, user[fd].nick, emote); sendtoall(msg); sprintf(emote, "a"); return 1; } problemet er at den ikke overskriver "emote", men bare smider texten ind i den og lader det overskydende være.. er totalt lost
Annonceindlæg fra Publicis Sapient
Får replace sat den terminerende nul byte korrekt ?
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'; return; }
du gav mig den replace funktion :)
Hm. Den sætter jo også den nul byten. :-) Så burde koden ovenfor også virke ! Prøv evt. at skrive test og emote ud for at se præcis hvad der sker.
har lavet denne test med henholdsvis "hopper", "danser" og "ok" hopper hopper danser danser ok er oker
int write_emote(int fd, char text[3000]) { char msg[5000]; char emote[3000]; int len; printf("%s\n", text); strcpy(emote, text); replace(emote, "\n\r", ""); replace(emote, "\r", ""); replace(emote, "\n", ""); printf("%s\n", emote); sprintf(msg, "%s!.!<font color=666666><i>%s %s</i>\n\r", user[fd].ikon, user[fd].nick, emote); sendtoall(msg); sprintf(emote, "a"); return 1; } den ser sådan ud nu
meget.. hmm :-/ er totalt lost
Eller så er det som det skal være ! #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'; return; } int write_emote(char *text) { char emote[3000]; printf("%s\n", text); strcpy(emote, text); replace(emote, "\n\r", ""); replace(emote, "\r", ""); replace(emote, "\n", ""); printf("%s\n", emote); return 1; } int main() { write_emote("hopper\r\n"); write_emote("danser\r\n"); write_emote("ok\r\ner\r\n"); } giver: hopper hopper danser danser ok er oker og det er dat korrekt !
det er jo meningen det skal give: hopper hopper danser danser ok ok
mit problem ser ud til at være et andet sted.. else if (strncmp(buf+0,"/me",3)==0) { char msg[3000]; strncpy(msg,buf+4,len); printf("%s\n", msg); //write_emote(fd, msg); } der går det galt..
Den er også gal. strncpy sætter ikke en nul byte ind. Prøv med: else if (strncmp(buf+0,"/me",3)==0) { char msg[3000]; strncpy(msg,buf+4,len); msg[len]='\0'; printf("%s\n", msg); //write_emote(fd, msg); }
PS: Er det med vilje at du springer over den første char efter "/me" ? (du tester på 3 chars med skipper 4 chars)
Yep, det er med vilje.. hvis brugeren f.eks skriver "/me hopper", skal den jo ikke tage det mellemrum med :)
OK. Hjalp der at sætte nul byten ind ?
Takker, det virkede nu.. hmm, hvorfor sætter strncpy ikke den nul byte ind?
Sådan fungerer strncpy altså. Det er lusket, frodi strcpy altid sætter den nul byte ind. Men strncpy gør det ikke hvis n'et nåes. Og der er mange gennem årene som har bandet og svovlet over det.
kan jeg sgu godt forstå.. det var jo også svært at vide :) men takker for hjælpen
Kurser inden for grundlæggende programmering