Avatar billede nomak Nybegynder
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
Avatar billede arne_v Ekspert
13. maj 2003 - 23:06 #1
Får replace sat den terminerende nul byte korrekt ?
Avatar billede nomak Nybegynder
13. maj 2003 - 23:07 #2
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;
}
Avatar billede nomak Nybegynder
13. maj 2003 - 23:08 #3
du gav mig den replace funktion :)
Avatar billede arne_v Ekspert
13. maj 2003 - 23:13 #4
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.
Avatar billede nomak Nybegynder
13. maj 2003 - 23:18 #5
har lavet denne test med henholdsvis "hopper", "danser" og "ok"

hopper

hopper
danser

danser
ok
er

oker
Avatar billede nomak Nybegynder
13. maj 2003 - 23:18 #6
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
Avatar billede arne_v Ekspert
13. maj 2003 - 23:28 #7
Det ser mystisk ud.
Avatar billede nomak Nybegynder
13. maj 2003 - 23:30 #8
meget.. hmm :-/ er totalt lost
Avatar billede arne_v Ekspert
13. maj 2003 - 23:35 #9
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 !
Avatar billede nomak Nybegynder
14. maj 2003 - 08:08 #10
det er jo meningen det skal give:

hopper

hopper
danser

danser
ok

ok
Avatar billede nomak Nybegynder
14. maj 2003 - 11:32 #11
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..
Avatar billede arne_v Ekspert
14. maj 2003 - 12:59 #12
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);

    }
Avatar billede arne_v Ekspert
14. maj 2003 - 13:00 #13
PS: Er det med vilje at du springer over den første char efter "/me" ?
    (du tester på 3 chars med skipper 4 chars)
Avatar billede nomak Nybegynder
14. maj 2003 - 13:20 #14
Yep, det er med vilje..

hvis brugeren f.eks skriver "/me hopper", skal den jo ikke tage det mellemrum med :)
Avatar billede arne_v Ekspert
14. maj 2003 - 13:25 #15
OK.

Hjalp der at sætte nul byten ind ?
Avatar billede nomak Nybegynder
14. maj 2003 - 13:26 #16
Takker, det virkede nu.. hmm, hvorfor sætter strncpy ikke den nul byte ind?
Avatar billede martinbk Nybegynder
14. maj 2003 - 13:27 #17
fordi himlen er blå ?
Avatar billede arne_v Ekspert
14. maj 2003 - 13:34 #18
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.
Avatar billede nomak Nybegynder
14. maj 2003 - 13:41 #19
kan jeg sgu godt forstå.. det var jo også svært at vide :) men takker for hjælpen
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