2016-12-01 3 views
2

Ich habe das folgende einfache c-Programm Ich versuche, in CLion auszuführen, aber sagt mir, dass mein Zeichen ein Zeiger sein muss, den ich bereits als Zeiger festgelegt und Array abc so deklariert habe Ich bin mir nicht sicher, was das Problem ist oder wie es zu debuggen ist! Der Code war ursprünglich ein Beispiel für eine Vorlesung und ich fügte die Zeigerdeklaration hinzu, um zu sehen, was passiert, wenn ich es ausführe. Jede Hilfe wäre zu schätzen.Einfaches C-Zeigerprogramm, läuft nicht

#include <stdio.h> 
#include <stdint.h> 

int main() { 
    char *a; 
    char abc[5]; 
    a = abc; 
    int i = 0; 

    while (1 == scanf("/%[^/ \t\n]", a[i++])) 
     printf(">%s<\n", a[i-1]); 
} 
+0

Ja, aber Sie * indexieren * diesen Zeiger, also übergeben Sie ein 'char' an' scanf'. –

+2

scanf wartet auf einen Zeiger, 'a [i ++]' ist kein Zeiger. '& a [i ++]' –

+2

... und mit einer Array-Länge von nur '5' ist es sehr wahrscheinlich, dass Sie seine Grenzen überschreiten werden. Schlagen Sie zunächst mit 'char abc [500]; –

Antwort

3

Obwohl a ein Zeiger ist, ist a[i++] nicht. Im Allgemeinen entspricht a[x]*(a + x), in Ihrem Fall ist es also so, als ob Sie *(a + i++) hätten, wobei der * den Zeiger dereferenziert. Sie können entweder &a[i++] verwenden, um es zurück in einen Zeiger zu verwandeln, oder a + i++.

+0

Danke die Erklärung! – Nuggets10

+0

@ Nuggets10 Ich bin froh, dass es hilfreich war. Anders als Sie gefragt haben, beachten Sie bitte den Kommentar von Weather Vane, der einen sehr stichhaltigen Punkt hervorruft: 'abc [5]' kann nur 4 Zeichen der Eingabe und den NUL-Terminator enthalten, so dass Sie ihn sehr wahrscheinlich überrennen werden Beschränken Sie nicht die Eingangslänge in Ihrem 'scanf'. – Arkku

1

scanf benötigt einen Zeiger in das gescannte Ergebnis zu bringen. Dies liegt daran, dass in C Argumente als Wert übergeben werden, so dass der Aufrufer sie nicht beschreiben kann. Wir umgehen das, indem wir einen Zeiger auf die ursprüngliche Variable übergeben, kann die aufgerufene Funktion dann auf die ursprüngliche Variable direkt auf eine Weise schreiben, die der Aufrufer sehen wird. Versuchen Sie,:

while (1 == scanf("/%[^/ \t\n]", a[i++])) 

in

while (1 == scanf("/%[^/ \t\n]", a + i++)) 
+0

Sogar Zeiger können nicht auf eine Weise geschrieben werden, die der Anrufer sieht ;-). (Der Speicher, auf den sie * zeigen, kann aber geschrieben werden, und dieser Schreibvorgang kann von jedem Teil des Programms beobachtet werden, der Zugriff auf diesen Speicher hat.) –

+1

@ PeterA.Schneider Ja, das ist in der Tat richtig. Ich habe versucht, es zu priorisieren, es einfach zu halten, um spezifisch zu sein, aber ich werde versuchen, es ein bisschen zu klären, danke. – Vality