AdminMod.de
https://www.adminmod.de/

Stringcount leicht abändern
https://www.adminmod.de/viewtopic.php?t=2770
Seite 1 von 1

Autor:  Weaselweb [ 30.04.2002, 11:30 ]
Betreff des Beitrags:  Stringcount leicht abändern

Hallo Scripter
ich will die folgende Funktion so abändern, dass nicht nur nach einem einzelnen Charakter gesucht wird, sondern nach einem beliebig langem String
der Ausgangscode aus der adminlib.inc
Code:
stock strcount(str[], searchchar) {
	new i = 0;
	new maxlen = strlen(str);
	new Count = 0;
	
	for(i = 0; i <= maxlen; i++) {
		if (str[i] == searchchar)
			Count++;
	}
	return Count;
}
ich hab schon eine Idee,wie ich das für einen Suchstring der Läge 2 mache,aber ich will eine allgemeine Lösung haben

Autor:  daRope [ 30.04.2002, 11:42 ]
Betreff des Beitrags: 

Was machst Du denn bei sowas?

Suche nach bb

String: abbababbbbbbababbbabb?

Was soll da fuer eine Anzahl rauskommen? 6? 9?

Autor:  Weaselweb [ 30.04.2002, 11:56 ]
Betreff des Beitrags: 

naja,will nach ";;" suchen, falls jemand ";" im Nick hat(solche wirds bestimmt geben)
oder ihr gebt mir einen besseren Trennstring
ich weiß nur keinen mehr,da die Leute ja auf immer verrücktere Nicks kommen

Autor:  [WING] Black Knight [ 30.04.2002, 12:35 ]
Betreff des Beitrags: 

Code:
stock strcount(str[], searchchar) {
  new i = 0;
  new maxlen = strlen(str);
  new maxlen2 = strlen(searchchar);
  new Count = 0;
  new merk[maxlen2+1];
  
  for(i = 0; i <= maxlen-maxlen2+1; i++) {
    merk="";
    for(j = 0; j <= maxlen2; i++){
      strcat(str[i], merk, maxlen2+1);
    }
    if (merk == searchchar)
      Count++;
  }
  return Count;
}
Ich hoffe, dass meine beschränkten Small-Kenntnisse ausreichen. Aber so ungefähr müsste es aussehen. Ist natürlich nicht getestet.
Ich sehe es schon kommen. Ich werde von da Rope in der Luft zerrissen.

Autor:  Weaselweb [ 30.04.2002, 14:46 ]
Betreff des Beitrags: 

erstmal Danke, so ähnlich habe ich mir das auch gedacht
bis auf ein paar kleine Fehler
wunder mich eins
Zitat:
Code:
strcat(str[i], merk, maxlen2+1);
ich weiß nicht, ob da dann merk auch den mehrere Zeichen hat,da bin ich mir nciht sicher, aber ansonsten müsste es funktionieren

PS: bei daRope's Beispiel würde 9 herauskommen

Autor:  [WING] Black Knight [ 30.04.2002, 14:55 ]
Betreff des Beitrags: 

Stimmt die Anzahl wäre 9. Anders würde es auch keinen Sinn machen.
Du kannst Dir auch gerne eine Variante für die 6 basteln. Nur dann muss das über eine while-Schleife gemacht werden, da bei erfolgreichen Finden der Index der i-Schleife um die Zeichenanzahl des Strings erhöht werden muss und nicht um 1. Die j Schleife kann so bleiben wie sie ist.
BTW, hab gerade einen Fehler genau dort entdeckt. Es muss heißen:
Code:
strcat(str[i+j], merk, maxlen2+1);
Außerdem habe ich j nicht definiert:
Code:
new j;

Autor:  daRope [ 01.05.2002, 00:31 ]
Betreff des Beitrags: 

Du solltest Code, den Du hier postest, mal kompilieren und pruefen. Jedenfalls dann, wenn Du Zweifel hast, ob er richtig sein koennte. (Wenn ich das da oben lese, wuerde ich Dir vorschlagen, das generell zu tun). Sonst kommen Leute mit noch weniger Ahnung, kopieren das in ihren Code und kommen dann wieder angewatschelt, weil es nicht tut und sie nicht wissen warum. Bei Deinem Code sollte Dich der Compiler laut anschreien und Dir die Festplatte um die Ohren hauen.

Autor:  Sir Drink a lot [ 01.05.2002, 04:06 ]
Betreff des Beitrags: 

Wenn der Compiler das tun würde, müsste ich mir jeden Tag eine neue Festplatte kaufen :-)

Autor:  DevilZero [ 01.05.2002, 09:34 ]
Betreff des Beitrags: 

oder neue Ohren :lol: :lol:

Autor:  [WING] Black Knight [ 01.05.2002, 20:27 ]
Betreff des Beitrags: 

Ich hab's geschrieben, weil ich bei der Arbeit war und ihm nur einen Lösungsweg aufzeigen wollte. Bevor ich ihm über 2 Seiten meinen Lösungsweg erkläre, dachte ich, dass der Skriptweg der einfachste wäre. Hätte vielleicht schreiben sollen, dass es nur ein Denkansatz war.

OK, ok , also ich hab es kompiliert und doch einen fetten Denkfehler gefunden. Arrays kann man direkt nicht vergleichen. Schade eigentlich... Und dann waren da noch ein paar Kleinigkeiten. Also neuer Vorschlag. Ich hoffe keinen Denkfehler gemacht zu haben:
Code:
stock strcount(str[], searchchar[]) {
 new i = 0;
 new j = 0;
 new maxlen = strlen(str);
 new maxlen2 = strlen(searchchar);
 new Count = 0;
 new merk[MAX_TEXT_LENGTH];
 new test = 1;
 
 for(i = 0; i <= maxlen-maxlen2+1; i++) {
  merk="";
  for(j = 0; j <= maxlen2; i++){
   strcat(str[i+j], merk, maxlen2+1);
  }
  test=strncmp(searchchar, merk, maxlen2);
  if (test == 0)
   Count++;
 }
 return Count;
}
Wie gesagt ist nur als Denkanstoß gedacht. Nicht als fertiger Code. Der Compiler läuft zwar jetzt ohne Fehler durch, aber die Funktion habe ich nicht getestet.

BTW, warum kann ich in Small die Arraylänge nicht in der Funktion vorgeben. Ich wollte sie gerne variabel von der Stringlänge wählen, kann aber nur mit bereits festgelegten Konstanten arbeiten. Mich würde interessieren, was hinter diesem Konzept steht.

Autor:  daRope [ 01.05.2002, 23:09 ]
Betreff des Beitrags: 

Zitat:
Ich hab's geschrieben, weil ich bei der Arbeit war und ihm nur einen Lösungsweg aufzeigen wollte. Bevor ich ihm über 2 Seiten meinen Lösungsweg erkläre, dachte ich, dass der Skriptweg der einfachste wäre. Hätte vielleicht schreiben sollen, dass es nur ein Denkansatz war.
Eigentlich wuerde ich an dieser Stelle sagen "dann schreib Pseudocode".
Zitat:
OK, ok , also ich hab es kompiliert und doch einen fetten Denkfehler gefunden. Arrays kann man direkt nicht vergleichen. Schade eigentlich... Und dann waren da noch ein paar Kleinigkeiten.
:) Nur nicht aufregen, Knighty, ich hab' ja nix gegen Dich. Ich bin oft so. =) Du wuerdest es schon merken, wenn es Dir an den Kragen geht. :)

Hier ein Vorschlag zu Guete. Meine erste Idee eines kleinen Dreizeilers geht in Small mangels Zeigern auch nicht. Daher hier mal der (korrekte) klassische Stringsearch zum drueber schlafen. Nicht so kompliziert denken, beim naechsten mal. ;)
Code:
stock strstrcount(str[], search[]) {
	new i = 0;
	new j = 0;
	new maxlen = strlen(str);
	new maxlen2 = strlen(search);
	new Count = 0;
	for(i = 0; i <= maxlen-maxlen2; i++) {
		for(j = 0; j <= maxlen2; j++){
			if ( j == maxlen2 ) {
				Count++;
				break;
			}  // if
			
			if ( str[i+j] != search[j] ) break;
		}  // for
	}  // for

	return Count;
}
Zitat:
BTW, warum kann ich in Small die Arraylänge nicht in der Funktion vorgeben. Ich wollte sie gerne variabel von der Stringlänge wählen, kann aber nur mit bereits festgelegten
Konstanten arbeiten. Mich würde interessieren, was hinter diesem Konzept steht.
Oje *stoehn* einfache Antwort: weil es nicht so implementiert ist.
Andeutung der Problematik: Weil der Heap in der AMX eigentlich nur ein erweiterter Stack ist. Schon mal von gehoert, Heap und Stack? Es lassen sich viele Gruende finden. Small ist nun mall Small C. Da ist das ebenso. Und von VLAs in C99 will ich nun wirklich nicht anfangen, das fuehrt zu weit. Unterm Strich: ist halt so.

Oder Du fragst den Author. :)

Autor:  [WING] Black Knight [ 02.05.2002, 09:13 ]
Betreff des Beitrags: 

Äußerst pfiffige Idee die Zeichen einzeln zu vergleichen. Dadurch kann man sich in der Regel einige Durchläufe ersparen. Der Code dürfte wohl 5 mal schneller sein als meiner. Ja, ich weiß, man hat mich schonmal betitelt mit der Zeile: Warum einfach, wenn es auch einfach geht. :D
Sorry, von Programmiertheorie habe ich keine Ahnung. Habe nicht wie Du etwas informatiktechnisches studiert und in Verfahrenstechnik gehört es auch nicht zum Lehrumfang. Der Hinweis, dass es nicht implementiert ist und Du es auch nicht genau weißt, hätte gelangt. Ich hatte nur an Speicherersparnis gedacht. Macht ja nichts, mit Deinem Code ist das Thema eh vom Tisch. :wink:

Seite 1 von 1 Alle Zeiten sind UTC+01:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/