#include "a3.h" #include #include #include #include void memdump(unsigned char *string) { printf("ADDR\t\t00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF\n"); int columns = 16; int rows = 4; char symbols[columns * rows]; if((long) string % 16 != 0) { string = string - ((long) string % 16); } for(int i = 0; i < rows; i++) { printf("%p\t", (void *) &string[i * columns]);//print address if((long) string % 16 != 0) { printf("oh nein, kein mod 16"); } for (int j = i * columns; j < (i + 1) * columns; j++) { printf("%02x ", string[j]);//print char number if(string[j] < 0x20 || string[j] > 0x7e)//check for printable characters symbols[j] = '.'; else symbols[j] = string[j]; } printf(" "); //print characters for (int j = i * columns; j < (i + 1) * columns; j++) { printf("%c", symbols[j]); } printf("\n"); } } int memreplace(char *string, char cin, char cout, char **caddr) { int found = 0; for (int i = 0; i < strlen(string); ++i) { //if char is to be replaced if(string[i] == cin) { string[i] = cout;//replace char found++; *caddr = &string[i];//setting last found address } } return found; } int main(int argc, char **argv) { if(argc != 4) { printf("Not enough arguments or to many arguments"); return -1; } memdump((unsigned char *) argv[0]); printf("\tLaenge der Zeichenkette (inkl \\0): %i Byte(s)\n", (int) strlen(argv[1])); printf("\tErsetzen: '%c' mit '%c'\n", *argv[2], *argv[3]); unsigned char *copy = malloc(4 * 16 * sizeof(char));//allocate memory for all chars strcpy((char *) copy, argv[1]); char *lastAddress = NULL; int count = memreplace((char *) copy, *argv[2], *argv[3], &lastAddress); printf("\tSuchzeichen wurde %i mal gefunden und ersetzt\n", count); printf("\tzuletzt an Addresse %p \n", (void *) lastAddress); memdump(copy); free(copy); return 0; }