Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Problem mit ermitteln von Zahlenwert

Empfohlene Antworten

Veröffentlicht

Hallo liebe Community,

ich habe ein Problem mit C. Und zwar möchte ich aus einem String einen ganz einfachen Hashwert ermitteln. Also eine Art Prüfsumme.

Und zwar wird in einer Schleife der Index des zu codierenden Strings angesprochen, und diesen mit einem Array vergleicht. Ist dieser char vorhanden, dann nehme den Index und schaue an der Stelle im Zahlenarray und addiere den mit der Variable "hash".

Und so geht das den ganzen String durch. Aber irgendwie addiert mein Programm "Hash" nicht auf. Ich glaube auch das itoa beim umwandeln nur zahlen bringt.

Habt ihr ne Idee was ich falsch mache bzw. was ich besser machen könnte???


#include <stdlib.h>

#include <ctype.h>

#include <string.h>

#include <stdio.h>

#include "asuro.h"


int volt, zaehler, HashWert, hash, i,length_cwert;


// Char-Array / das gleiche wie Strings

char text2[100];

char text[100];

char test[100];

char string[255];

char tmp[255];


char cWerte[38][1] = {"1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",";",":","#"};

int iWerte[38] = {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};


int ermittleHash(char string[255])

{


	hash = 10;

	int zahl = 0;

	length_cwert = sizeof(cWerte) / sizeof(cWerte[0]);


	while(zahl < strlen(string))

	{

		for(i=0; i<length_cwert; i++)

		{			

			itoa(string[zahl], tmp, 10);

			if(strcmp(tmp, cWerte[i]) == 0)

			{

				hash += iWerte[i];

			}

		}

		zahl++;

	}


	return hash;

}


int main(void)

{

	Init();


	while(1)

	{

		// alle 1000 Durchläufe ausführen

		if(zaehler % 30000 == 0)

		{

			// copy des Quellstring nach char Test

			strcpy(test, "id:asr_001:bat:");

			// Batteriewerte werden ermittelt

			int a = Batterie();

			int b = Batterie();

			if (a ==  volt = a;


			// wandelt volt (int) in ein char-Array

                        itoa(volt, text, 10);

			// Alternativ auch ...


			// strcat hängt den parameter an den ersten

			strcat(test, text);

			strcat(test, ";");

			// ErmittleHash

			HashWert = ermittleHash(test);


			itoa(HashWert, text2, 10);

			strcat(test, text2);

			strcat(test, "#");


			SerPrint(test);

		}

		zaehler++;

	}

}


[/code]

Danke & Gruß

xXx

itoa(string[zahl], tmp, 10);
Mit dieser Anweisung erhältst du einen String, der die dezimale Schreibweise des ASCII-Codes des Zeichens an der Stelle zahl enthält.

Das ist sicher nicht, was du willst.

Du brauchst hier weder itoa noch strcmp, du willst doch nur Zeichen mit Zeichen vergleichen.

Wandle cWerte um in ein Array von char:

char cWerte[38] = {'1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',';',':','#'};

Dann kannst du string[zahl] und cWerte direkt vergleichen.

Danke für die schnelle Antwort. ok also das weglassen. aber komischerweise bleibt der hashwert beim Standardwert 0. Eigentlich müsste er es doch aufaddieren.

Hier die geänderte Funktion:


int ermittleHash(char string[255])

{

	hash = 0;

	int zahl = 0;

	length_cwert = sizeof(cWerte) / sizeof(cWerte[0]);


	while(zahl < strlen(string))

	{

		for(i=0; i<length_cwert; i++)

		{			

			if(string[zahl] == iWerte[i])

			{

				hash += iWerte[i];

			}

		}

		zahl++;

	}

	return hash;

}

achja ... hatte ich mich nur verschrieben sry...

jetzt bringt der compilier aber noch eine warnung:

test.c:30: warning: comparison between pointer and integer

was meint der damit???

Hm eigentlich hab ich schon den Code abgeändert...


#include <stdlib.h>

#include <ctype.h>

#include <string.h>

#include <stdio.h>

#include "asuro.h"


int volt, zaehler, HashWert, hash, i,length_cwert;


// Char-Array / das gleiche wie Strings

char text2[100];

char text[100];

char test[100];

char string[255];

char tmp[255];


char cWerte[39][1] = {"1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",";",":","#", "_"};

int iWerte[39] =     { 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};


int ermittleHash(char string[255])

{


	hash = 0;

	int zahl = 0;

	length_cwert = sizeof(cWerte) / sizeof(cWerte[0]);


	while(zahl < strlen(string))

	{

		for(i=0; i<length_cwert; i++)

		{			

			if(string[zahl] == cWerte[i])

			{

				hash += iWerte[i];

			}

		}

		zahl++;

	}


	return hash;

}


int main(void)

{

	Init();


	while(1)

	{

		// alle 1000 Durchläufe ausführen

		if(zaehler % 30000 == 0)

		{

			// copy des Quellstring nach char Test

			strcpy(test, "id:asr_001:bat:");

			// Batteriewerte werden ermittelt

			int a = Batterie();

			int b = Batterie();

			if (a ==  volt = a;


			// wandelt volt (int) in ein char-Array

            itoa(volt, text, 10);

volt);


			// strcat hängt den parameter an den ersten

			strcat(test, text);

			strcat(test, ";");

			// ErmittleHash

			HashWert = ermittleHash(test);


			itoa(HashWert, text2, 10);

			strcat(test, text2);

			strcat(test, "#");


			SerPrint(test);

		}

		zaehler++;

	}

}


[/code]

Hm eigentlich hab ich schon den Code abgeändert...

:mod:

Wandle cWerte um in ein Array von char:

char cWerte[38] = {'1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',';',':','#'};

na das cWerte war doch schon ein char Array oder nicht???

na jedenfalls hab ich das jetzt ein bissl anders gelöst ... ich hab einfach die dezimalen Code des ASCII Zeichens genommen und addiert. Das reicht erstmal.


int ermittleHash(char string[255])

{


	hash = 0;

	int zahl = 0;

	//length_cwert = sizeof(cWerte) / sizeof(cWerte[0]);


	while(zahl < strlen(string))

	{

		itoa(string[zahl], tmp, 10);

		hash += atoi(tmp);

		zahl++;

	}


	return hash;

}

na das cWerte war doch schon ein char Array oder nicht???
Nein, es war ein Array von char-Arrays. Das ist etwas ganz anderes.

na jedenfalls hab ich das jetzt ein bissl anders gelöst ... ich hab einfach die dezimalen Code des ASCII Zeichens genommen und addiert. Das reicht erstmal.

...

itoa(string[zahl], tmp, 10);
hash += atoi(tmp);[/code]

Du wandelst eine Zahl in einen String um, und gleich danach wandelst du diesen String wieder in eine Zahl um. Etwas umständlich, findest du nicht?

Warum addierst du nicht gleich string[zahl] auf deinen Hash?

na wie bekomm ich denn den dezimalen wert des buchstaben heraus???

na wie bekomm ich denn den dezimalen wert des buchstaben heraus???

Da gibt es nicht herauszubekommen, der Buchstabe ist selbst ein Zahlenwert. char ist ein Ganzzahldatentyp, der "Wert" ist der ASCII-Code des Zeichens.

Und einen "dezimalen Wert" gibt es nicht. Zahlensysteme braucht man nur für die Darstellung, das ist keine Eigenschaft eines Wertes. 0xff, 255, 0377 und b11111111 sind nur unterschiedliche Darstellungen für denselben Wert, das brauchst du beim Rechnen nicht zu berücksichtigen. Zahlensystem sind nur dann von Interesse, wenn du Zahlen in Text oder Text in Zahlen umwandelst. Intern speichert der Computer sowieso alle Zahlen im Dualsystem.

Schreib also einfach

hash += string[zahl];

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.