Skip to content
Snippets Groups Projects
Commit 0d32b910 authored by Peter Gerwinski's avatar Peter Gerwinski
Browse files

Musterlösung 5.11.2018 vervollständigt

parent c38edbc0
No related branches found
No related tags found
No related merge requests found
No preview for this file type
...@@ -230,7 +230,76 @@ ...@@ -230,7 +230,76 @@
\solution \solution
Wird nachgereicht. \begin{enumerate}[\quad(a)]
\item
\textbf{Erklären Sie die Ausgabe.}
In der Schleife wird \emph{zuerst\/} der nächste Buchstabe \lstinline{target[i + 1]}
gleich dem aktuellen gesetzt
und \emph{danach\/} der Zähler \lstinline{i} erhöht.
Dadurch wird im nächsten Schleifendurchlauf der bereits verschobene Buchstabe
noch weiter geschoben und letztlich alle Buchstaben in \lstinline{target[]}
durch den an der Stelle \lstinline{pos} ersetzt.
\item
\textbf{Schreiben Sie die Funktion \lstinline|insert_into_string()| so um,
daß sie den Buchstben \lstinline{src} an der Stelle \lstinline{pos}
in den String \lstinline{target} einfügt.}\par
\textbf{Die Ausgabe des Programms müßte dann
\lstinline[style=terminal]{Hochschule Bochum} lauten.}
Um im String "`Platz zu schaffen"', muß man von hinten beginnen,
also die Schleife umdrehen\\
(siehe: \gitfile{hp}{20181105}{loesung-2.c}):
\begin{lstlisting}{gobble=8}
for (int i = len; i > pos; i++)
target[i] = target[i - 1];
\end{lstlisting}
\item
\textbf{ Was kann passieren, wenn Sie die Zeile
\lstinline{char test[100] = "Hochshule Bochum";}\\
durch
\lstinline{char test[] = "Hochshule Bochum";}
ersetzen und warum?}
Die Schreibweise \lstinline{test[]} bedeutet,
daß der Compiler selbst zählt, wieviel Speicherplatz der String benötigt,
un dann genau die richtige Menge Speicher reserviert
(anstatt, wie wir es manuell getan haben, pauschal Platz für 100 Zeichen).
Wenn wir nun in den String ein zusätzliches Zeichen einfügen,
ist dafür kein Speicherplatz reserviert worden,
und wir \textbf{überschreiben} dann Speicher, an dem sich andere Variablen befinden,
was zu einem \textbf{Absturz} führen kann.
Da wir hier nur ein einziges Zeichen schreiben,
wird dieser Fehler nicht sofort auffallen.
Dies ist schlimmer, als wenn das Programm direkt beim ersten Test abstürzt,
denn dadurch entsteht bei uns der Eindruck, es sei in Ordnung.
Wenn danach der Fehler in einer Produktivumgebung auftritt,
kann dadurch Schaden entstehen -- je nach Einsatzgebiet der Software
u.\,U.\ erheblicher Vermögens-, Sach- und/oder Personenschaden
(z.\,B.\ Absturz eines Raumflugkörpers).
\item
\textbf{Was passiert, wenn Sie
\lstinline{char test[100] = "Hochshule Bochum";}\\
durch
\lstinline{char *test = "Hochshule Bochum";}
ersetzen und warum?}
In diesem Fall wird der Speicher für den eigentlichen String
in einem unbenannten, \textbf{nicht schreibbaren} Teil des Speichers reserviert.
Unser Versuch, dorthin ein zusätzliches Zeichen zu schreiben,
fürt dann normalerweise zu einem \textbf{Absturz}.
In manchen Systemen (Betriebssystem, Compiler, \dots)
ist der Speicherbereich tatsächlich sehr wohl schreibbar.
In diesem Fall tritt der Absturz nicht immer und nicht immer sofort auf --
genau wie in Aufgabenteil (c).
\end{enumerate}
\exercise{Länge von Strings} \exercise{Länge von Strings}
......
#include <stdio.h>
#include <string.h>
void insert_into_string (char src, char *target, int pos)
{
int len = strlen (target);
for (int i = len; i > pos; i++)
target[i] = target[i - 1];
target[pos] = src;
}
int main (void)
{
char test[100] = "Hochshule Bochum";
insert_into_string ('c', test, 5);
printf ("%s\n", test);
return 0;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment