Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

idontknow

unregistriert

1

27.04.2009, 19:03

[C]Sonderzeichen aus String herausfiltern

Hiho :D

es geht darum, dass ich in der Schule die Aufgabe erhalten habe, ein Prog zu schreiben dass alle Sonderzeichen + Leerzeichen aus einem String der eingegeben wird, entfernt werden und der neue String danach ausgegeben wird.

Bitte erstmal keine vorgefertigten Codes, sonst lerne ich ja nix dabei ;)


Zusätzlich soll das ganze nur in C, also ohne zusätzliche Header wie cstring oder ähnliches gemacht werden, nur <stdio.h> und <string.h> wobei bei letzterem nru dei Funktion strlen(int) und gets(char) genutzt wird um string Länge undzu erhalten und Satz einzulesen!

Soweit die Vorgaben:
Folgendes habe ich mir gedacht:
Ich gehe jedes Zeichen durch, nehme hierbei als Angabe für die Shcleife strlen(char). Jedes Zeichen wird in einen INT wert gecaste (kA wie man das formuliert °_°) und dieser wir dann mit einer ASCII Tablle abgeglichen, ob der Wert eben ein Buchstabe (Groß- + Kleinschreibung und Zahlen!) ist.

Ich hab das mit (int) char_variable; gemacht, da ich die C Version nicht kenne oO. (war das static_cast<int>?)
Sollte das Zeichen eben ein Sonderzeichen sein wurde der String neu aufgebaut ohne das Zeichen, das hat leider nicht funktioniert ... Den Code habe ich leider schon weggeworfen, da ichs neu probiert habe.

Meine Frage: Liegt es daran wie ich das Sonderzeichen überpürfe?, weil eine Ausgabe vom char Zeichen 'a' hat wie erwartet 65 ergeben was ja stimmen müsste.

Oder lagg es dann wohl eher an meiner Umsetzung und die Überprüfung auf Sonderzeichen hat gepasst??

Gibts bessere Alternatven dafür? (ohne mass Header gespamme und hochkomplizierte Funktionne, pls nur Lößungsnansätze :D)

mfg

2

27.04.2009, 19:30

Mal ein paar Tips:
(int) char_variable ist die C-Variante
Du kannst chars miteinander vergleichen. char_variable=='+'

Leg doch nen neuen String an in den du alle Zeichen überträgst, die nicht gelöscht werden sollen. Oder überschreib den vorhergehenden Teil des Strings mit später auftretenden Buchstaben und überschreib so alles.

3

27.04.2009, 19:33

Zitat

Ich hab das mit (int) char_variable; gemacht, da ich die C Version nicht kenne oO. (war das static_cast<int>?)

Nein, das was du machst passt schon.
Was ich aber nicht ganz verstehe ist, in welcher Form dein String vorliegt; als char* oder als std::string?

Zitat

weil eine Ausgabe vom char Zeichen 'a' hat wie erwartet 65 ergeben was ja stimmen müsste.

So viele ASCII-Werte kenne ich dann doch noch auswendig, um sagen zu können, dass das nicht stimmt:
A = 65
a = 97


Ich hätte gerade eine Idee, die Aufgabe zu lösen: Überprüfe das wie vorgeschlagen mit den ASCII-Werten, und notiere dir, welche Zeichen alle weggelöscht werden sollen. Im nächsten Schritt kopierst du dann den eingegebenen String in einen neuen und ignorierst dabei die Zeichen, die du in Schritt 1 notierst hast.
Diese zwei Schritte lassen sich natürlich auch zu einem Schritt vereinen.

Hm, bei der Überprüfung gerade musste ich feststellen, dass ich so lange brauchte, dass Genion eine sehr ähnliche Idee vor mir schrieb. :evil:

4

27.04.2009, 19:59

Zitat von »"defaultplayer^^

Zitat

Ich hab das mit (int) char_variable; gemacht, da ich die C Version nicht kenne oO. (war das static_cast<int>?)

Nein, das was du machst passt schon.
Was ich aber nicht ganz verstehe ist, in welcher Form dein String vorliegt; als char* oder als std::string?
in C gibts kein std::string

idontknow

unregistriert

5

27.04.2009, 20:03

Ich nehme ganz normale char arrays, da das Thema arrays ist und man die nutzen soll!

Gibt evtl. auch einfacher Möglichkeiten wie std::strings oder ähnliches ist aber nicht Sinn der Übung ;)

6

27.04.2009, 20:08

In C gibts afaik nur char* bzw. char-arrays. Es gibt einige Funktionen zur Arbeit mit diesen (z.B. strcpy und strlen). Wenn er mit C++ arbeitet, dann wirds auch std::string und einfacherer Möglichkeiten geben. ;)

VuuRWerK

Frischling

Beiträge: 59

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

7

27.04.2009, 20:38

Hier mal ein Beispiel von mir, kann man sicherlich noch an einigen Stellen optimieren und man kommt ganz ohne string.h aus ;)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <stdio.h>
#include <stdlib.h>

#define is_alpha(c) \
  ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))

inline int
_strlen(const char* s) {
  int l; l = 0;
  while (s[l++] != '\0');
  return l - 1;
}

inline char*
remove_special_sing(const char* s) {
  char* tmp;
  tmp = malloc(sizeof(char) * _strlen(s));
  int i, j;
  i = j = 0;
  while (s[i] != '\0') {
    if (is_alpha(s[i]))
      tmp[j++] = s[i++];
    else
      ++i;
  }
  tmp = realloc(tmp, j + 1);
  tmp[j] = '\0';
  return tmp;
}

int main(int argc, char* argv[]) {
  const char s[] = "Das ist ein String mit Sonderzeichen %$&§()?#+*";
  char* s2;
  printf("input string: %s\n", s);
  s2 = remove_special_sing(s);
  printf("clean string: %s\n", s2);
  free(s2);
  return 0;
}


Gut Schuß
VuuRWerK ;)
http://german-bash.org/212445
"C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off." - Bjarne Stroustrup

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

27.04.2009, 20:40

[spam]
sizeof(char) <- sehr sinnvoll
[/spam]

Ansonsten lässt sich der Code definitiv noch an der ein oder anderen Stelle etwas "optimieren". :P

VuuRWerK

Frischling

Beiträge: 59

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

9

27.04.2009, 20:45

Zitat von »"David_pb"«

[spam]
sizeof(char) <- sehr sinnvoll
[/spam]

Was gibt es daran auszusetzen? Weil es sowieso nicht größer als ein byte ist? Hm kann man sich drauf verlassen? Ich weiß es nicht also nehm ich gleich sizeof, der Compiler optimierts weg wenns nicht nötig ist ;)

Zitat von »"David_pb"«


Ansonsten lässt sich der Code definitiv noch an der ein oder anderen Stelle etwas "optimieren". :P

Na dann mal los :P

Gut Schuß
VuuRWerK ;)
http://german-bash.org/212445
"C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off." - Bjarne Stroustrup

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

27.04.2009, 20:50

Zitat von »"VuuRWerK"«

Zitat von »"David_pb"«

[spam]
sizeof(char) <- sehr sinnvoll
[/spam]

Was gibt es daran auszusetzen? Weil es sowieso nicht größer als ein byte ist? Hm kann man sich drauf verlassen? Ich weiß es nicht also nehm ich gleich sizeof, der Compiler optimierts weg wenns nicht nötig ist ;)


Laut Standard ist sizeof(char) immer 1.

Werbeanzeige