Letters verwijderen

Status
Niet open voor verdere reacties.

Bremm007

Nieuwe gebruiker
Lid geworden
28 jan 2011
Berichten
2
Hallo,

Ik wil in een tagnaam een aantal letters verwijderen met behulp van Ilen

bv

FQICSZA12 moet worden FC12

Hoe krijg ik dit voor elkaar?

Ik kan er wel een spatie van maken als volgt:

strcpy (szTag, TagName);
for (i=0; i<iLen; i++) {
if (szTag == '_')
szTag = ' ';
if (szTag == 'Q')
szTag = ' ';
if (szTag == 'I')
szTag = ' ';
if (szTag == 'S')
szTag = ' ';
if (szTag == 'Z')
szTag = ' ';
if (szTag == 'A')
szTag = ' ';

help!!
 
Een mogelijke manier in C (uit het hoofd):
[CPP]char* szTag[iLen + 1];
char* result[iLen + 1];
int i, j;

strncpy(szTag, TagName, iLen); //kopieer nooit meer dan szTag aankan!
for (i=0, j=0; i<iLen; i++) {
switch (szTag) {
case '_':
case 'Q':
case 'I':
case 'S':
case 'Z':
case 'A':
break; //doe niks
default: //alle niet bovenvermelde cases
result[j++] = szTag; //kopieer naar result
break;
}
}
result[j] = '\0'; //sluit string af
//werk verder met result
[/CPP]

In C++ kan je vast iets doen met de stringfuncties/regexp. (string STL)
 
Een mogelijke manier in C (uit het hoofd):
[CPP]char* szTag[iLen + 1];
char* result[iLen + 1];
[/CPP]

Een paar verbeterpunten:

- char *naam[lengte] geeft uiteraard een array van char pointers -> char naam[lengte] is dus wat je eigenlijk wilt
- het heeft mijns inziens weinig nut om de inhoud van TagName eerst naar szTag te kopiëren omdat het ook volstaat om direct alle waardes van TagName zelf te gebruiken
 
Krijg het niet voor elkaar

Heren,

Kunnen jullie mij toch nog iets meer info geven ben geen C goeroe. en krijg het niet voor elkaar met de gegeven info.

Wat is bv de code binnen I-len om een karakter te verwijderen?

Dus if t then delete in basic taal

gr
 
Mijn eerste code-probeersel waarop de opmerkingen van CoD_NL zijn toegepast:
[CPP]char szTag[iLen + 1];
int i, j;

for (i = 0, j = 0; i < iLen; i++) //loop over de inhoud van szTag karakter per karakter
{
switch (szTag)
{
case '_':
case 'Q':
case 'I':
case 'S':
case 'Z':
case 'A':
break; //doe niks --> betekent dat het karakter verwijderd zal worden
default: //alle niet bovenvermelde cases
szTag[j++] = szTag; //behoud karakter
break;
}
}
szTag[j] = '\0'; //sluit string af[/CPP]
In het nederlands:
Je tagnaam is een opeenvolging van karakters, je loopt karakter per karakter over tagnaam en kijkt of dat karakter overgeslaan moet worden of niet.

Stap voor stap voorbeeld van wat deze code doet:
Code:
voor iLen = 9
Inhoud van szTag       i      j
FQICSZA12\0            0      0         //start
FQICSZA12\0            1      1         //einde lus 1: F wordt bewaard
FQICSZA12\0            2      1         //einde lus 2: Q wordt overgeslaan
FQICSZA12\0            3      1         //einde lus 3: I wordt overgeslaan
FCICSZA12\0            4      2         //einde lus 4: C wordt bewaard
FCICSZA12\0            5      2         //einde lus 5: S wordt overgeslaan
FCICSZA12\0            6      2         //einde lus 6: Z wordt overgeslaan
FCICSZA12\0            7      2         //einde lus 7: A wordt overgeslaan
FC1CSZA12\0            8      3        //einde lus 8: 1 wordt bewaard
FC12SZA12\0            9      4        //einde lus 9: 2 wordt bewaard
FC12\0              //afsluiten string
 
Laatst bewerkt:
Een variant op de code van Johantrax in een functie gestopt:

[cpp]
char *FilterTagName(const char *tagName) {
const unsigned int len = strlen(tagName);
char *filteredTagName = (char *)malloc(sizeof(char)*len+1);
if (filteredTagName == NULL) return NULL; // reden van edit
unsigned int i = 0;
while (*tagName) {
if (!(*tagName == '_' || *tagName == 'Q' || *tagName == 'I' || *tagName == 'S' || *tagName == 'Z' || *tagName == 'A')) filteredTagName[i++] = *tagName;
tagName++;
}
filteredTagName = '\0';
return filteredTagName;
}
// ...
char *filteredTagName = FilterTagName("FQICSZA12");
// ...
free(filteredTagName);
[/cpp]
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan