#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
|
|
// summary ofstring placement
|
|
/*
|
|
char *globalHeader = "Chapter";
|
|
char globalArrayHeader[] = "Chapter";
|
|
|
|
void displayHeader() {
|
|
static char *staticHeader = "Chapter";
|
|
char *localHeader = "Chapter";
|
|
static char staticArrayHeader[] = "Chapter";
|
|
char localArrayHeader[] = "Chapter";
|
|
char *heapHeader = malloc(strlen("Chapter")+1);
|
|
strcpy(heapHeader, "Chapter");
|
|
}
|
|
*/
|
|
|
|
|
|
int main(void) {
|
|
|
|
// print size of char & character literal
|
|
printf("%zu\n", sizeof(char));
|
|
printf("%zu\n", sizeof('a'));
|
|
|
|
|
|
// when a string is not a constant
|
|
// doesn't work with gcc anymore, also with -Wno-deprecated-writable-strings
|
|
// gives 'Bus error: 10'
|
|
{
|
|
char *tabHeader = "Sound";
|
|
//*tabHeader = 'L';
|
|
printf("%s\n", tabHeader);
|
|
}
|
|
|
|
|
|
// string initialization
|
|
{
|
|
// array of char
|
|
char header[] = "Media Player";
|
|
printf("%s\n", header);
|
|
|
|
header[0] = 'W';
|
|
header[1] = 'u';
|
|
header[2] = 'r';
|
|
header[3] = 's';
|
|
header[4] = 't';
|
|
header[5] = '\0';
|
|
printf("%s\n", header);
|
|
|
|
// pointer to char (with memory allocation)
|
|
char *headerPtr = malloc(strlen("Media Player") + 1);
|
|
if (headerPtr != NULL) {
|
|
strcpy(headerPtr, "Media Player");
|
|
printf("%s\n", headerPtr);
|
|
|
|
*headerPtr = 'W';
|
|
*(headerPtr + 1) = 'u';
|
|
*(headerPtr + 2) = 'r';
|
|
*(headerPtr + 3) = 's';
|
|
*(headerPtr + 4) = 't';
|
|
*(headerPtr + 5) = '\0';
|
|
printf("%s\n", headerPtr);
|
|
for (size_t j = 0; j < strlen(headerPtr); j++) {
|
|
printf("headerPtr[%zu] Address: %p Value: %c\n", j, &headerPtr[j], headerPtr[j]);
|
|
}
|
|
printf("\n");
|
|
free(headerPtr);
|
|
}
|
|
|
|
// direct init with character pointer
|
|
// don't create a new copy, instead a reference to string literal pool only
|
|
char *headerRef = "Media Player";
|
|
printf("%s\n", headerRef);
|
|
|
|
// you shouldn't assign a char pointer with a character literal
|
|
// because character literals is of type int
|
|
// wrong:
|
|
// char *prefix = '+';
|
|
// better:
|
|
char *prefix = malloc(2);
|
|
if (prefix != NULL) {
|
|
*prefix = '+';
|
|
*(prefix + 1) = 0;
|
|
printf("%s\n", prefix);
|
|
free(prefix);
|
|
}
|
|
|
|
// string initialisation from standard in
|
|
// don't forget to allocate memory before read from standard in
|
|
// wrong:
|
|
// char *command;
|
|
// printf("%s: ", "Enter a command");
|
|
// scanf("%s", command);
|
|
// better:
|
|
char *command = malloc(11);
|
|
if (command != NULL) {
|
|
printf("%s: ", "Enter a command (max. 10 chars): ");
|
|
scanf("%10s", command);
|
|
printf("You entered: %s with length: %zu\n", command, strlen(command));
|
|
free(command);
|
|
}
|
|
|
|
// memset buffer overflow test
|
|
// executes without warnings or errors on osx :D
|
|
char *mem = malloc(11);
|
|
if (mem != NULL) {
|
|
memset(mem, 0x42, 16);
|
|
for (size_t i = 0; i < 16; i++) {
|
|
printf("mem[%zu] Address: %p : %c\n", i, &mem[i], mem[i]);
|
|
}
|
|
free(mem);
|
|
}
|
|
|
|
}
|
|
|
|
#define KERNEL_PANIC 0x0000
|
|
|
|
char *mem = (int*) KERNEL_PANIC;
|
|
|
|
// standard string operations
|
|
|
|
// comparing strings
|
|
{
|
|
char command[16];
|
|
printf("Enter a command: ");
|
|
scanf("%15s", command);
|
|
// return value of strlen == 0 -> strings are equal
|
|
if (!strcmp(command, "quit")) {
|
|
printf("The command was quit\n");
|
|
} else {
|
|
printf("The command wasn't quit\n");
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|