Warum ist atoi, dass Sie mir einen segmentation fault?
Habe ich das folgende Stück code:
#include <stdio.h>
int main ( int argc, char *argv[] )
{
int M, N;
M = 1;
N = 1;
curr = 1;
if ( argv[1][0] == '-' )
{
curr = 2;
char *a = argv[1][1];
char *b = argv[1][3];
M = atoi(a);
N = atoi(b);
}
printf("%d\n%d", M, N);
}
So, ich pass dieses Programm so etwas wie dieses:
a.out -1,2
und anstatt der erwarteten Produktion
1
2
Bekomme ich einen segmentation fault. Was gibt?
Was kaputt compiler verwenden Sie?
char *a = argv[1][1];
sollte eine compiler - Fehler. C hat keine impliziten Konvertierungen von int
zu Zeigertypen.InformationsquelleAutor Waffles | 2010-11-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dass kompiliert?!
char argv*[] ist ein array von char-Zeigern.
char *a = argv[1][1]
wirdchar *
.So, jetzt sind Sie die Zuweisung eines char in einen char-Zeiger (sollte ein compile-Fehler).
Kann ich nur annehmen, dass Sie sagen wollte
char *a = &argv[1][1]
. Btw, const-correctness wäre auch schön, soconst char *a = &argv[1][1]
.Btw, dein code ist immer noch sehr unsicher - Sie don ' T sogar überprüfen Sie die Größe der Zeichenfolge. Vorstellen, was
&argv[1][3]
tut, wenn dein string hat nur zwei Zeichen.Es geht nicht um die Funktion, es geht um die Zuordnung einer
char
zu einemchar *
.Ich hatte angenommen, er meinte
char *a = argv[1] + 1;
oder&(argv[1][1]);
InformationsquelleAutor EboMike
#include <stdlib.h>
und es sollte deutlich geworden.Erarbeiten: du bist die übergabe eines integer in eine Funktion, die einen Zeiger erwartet, und der compiler könnte nicht warnen Sie, weil Sie vergessen haben zu erklären, dass die Funktion mit einem Prototyp. Dies ist die Ursache für den Absturz.
Darüber hinaus sind Sie einfach zu missbrauchen
atoi
. Dieatoi
analysiert strings, nicht für einzelne Zeichen. Wenn Sie möchten, dass der Wert eines Zeichen als eine Ziffer, einfach subtrahieren'0'
:In der Praxis sollten Sie auch prüfen, ob die Zeichen tatsächlich eine Ziffer.
Edit: ich erinnere mich nicht
char *a = argv[1][1];
wird in der original-post (vielleicht frühen Bearbeitungen nicht zeigen, wie bearbeitet?), aber jeder vernünftige compiler sollte eine compile-Zeit-Fehler auf dieser Linie. Integer nicht implizit konvertiert werden zu Zeigern in C. Wenn der compiler keine lassen dieses kommen, darunter dann ein Prototyp füratoi
wird nicht mehr helfen, da die Art der Fehler früher aufgetreten.InformationsquelleAutor R..
atoi nimmt einen string -, nicht ein Zeichen.
Auch, atoi ist nicht gut im Allgemeinen, wie es im Grunde genommen keine Fehler-reporting. Sie sollten untersuchen, strtol für die meisten Fälle.
InformationsquelleAutor singpolyma