2018-11-15 11:04:17 +01:00

80 lines
2.1 KiB
C

#include "a3.h"
#include <stdio.h>
#include <memory.h>
#include <malloc.h>
#include <stdint.h>
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;
}