Avatar billede stjernen Nybegynder
31. december 2004 - 17:38 Der er 4 kommentarer

funktion til at fjerne blanke tegn

Hej Eksperter

Jeg sidder her og roder med en funktion der skal fjerne blanke tegn. Dertil har jeg lavet en main()-funktion, men den er hvist ikke helt som den skal være, er der nogen der kan se fejlen?

Med venlig hilsen stjernen..

void opg18()
{
    char string[50];
   
    printf("Indtast en linje:");
    gets(string);
    fjern_blanke(string);
    printf("Resultat: %s\n", string);
}
void fjern_blanke(char s[])
{
    int i, j;
   
    /* Test for tom streng */
    if(s[0]=='\0')
        return;
       
    for(i=j=1 ; s[j] != '\0' ; j++)
    {
        if(s[i-1] == ' ' && s[j] == ' ')
                continue;
        s[i++] = s[j];
    }
    s[i] = '\0';
}
Avatar billede erikjacobsen Ekspert
31. december 2004 - 19:16 #1
Jeg tror nok denne virker:

void fjern_blanke(char s[]) {
    int i, j;

    i=0;
    for(j=0 ; s[j] != '\0' ; j++) {
        if(s[j] == ' ')
                continue;
        s[i++] = s[j];
    }
    s[i] = '\0';
}
Avatar billede thomas_nj Nybegynder
01. januar 2005 - 02:55 #2
Her er et forslag. Måake er det ikke voldsomt pænt men det virker da efter hensigten.  Jeg har gjort så der er taget hensyn til hvis flere mellemrum kommer efter hinanden i strengen.
Som en svaghed kan det nævnes at du max må sende en streng ind i den på 255 tegn da bufferen ellers vil overflowe. Dette kunne laves med string i stedet men jeg kan se at du selv bruger arrays så..
Nå men her er koden så

#include <iostream>
#include <cstdlib>
#include <string>


using namespace std;

void RemSpace(char []);

int main()
{
    char test[]="Hello World I am still alive";
    cout<<test<<endl;
    RemSpace(test);
    cout<<test<<endl;
    system("pause");
    return 0;
}

void RemSpace(char str[])
{
    int countStr=0;
    int countBuffer=0;
    char buffer[255];
    while(str[countStr])
    {
      while(str[countStr]==' ')
      {
        countStr++;
      }
        buffer[countBuffer++]=str[countStr++];
                               
    }
   
    buffer[++countBuffer]='\0';
    strcpy(str, buffer);
}
Avatar billede thomas_nj Nybegynder
01. januar 2005 - 03:02 #3
Her er version 2 hvor bufferen er sparet væk. Der er dog et sted jeg er lidt i tvivl om
#include <iostream>
#include <cstdlib>
#include <string>


using namespace std;

void RemSpace(char []);

int main()
{
    char test[]="Hello World I am still alive";
    cout<<test<<endl;
    RemSpace(test);
    cout<<test<<endl;
    system("pause");
    return 0;
}

void RemSpace(char str[])
{
    int count=0;
    int count2=0;
    char buffer[255];
    while(str[count])
    {
      while(str[count]==' ')
      {
        count++;
      }
        str[count2++]=str[count++];
                               
    }
  str[++count2]='\0'; // <- Må man godt bare gøre sådan her? 
}
Avatar billede bertelbrander Novice
01. januar 2005 - 18:12 #4
>thomas_nj, ja man må godt gøre sådan, men i dit tilfælde skal man ikke tælle count2 op inden man skrive nul termineringen, det bevirker at der kommer et tegn for meget med i slutningen.
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





White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis