4 Stimmen

printf()-Anweisung einen Unterschied zu meinem Rückgabewert macht? - C-Programmierung

Ich experimentiere mit einer der Funktionen im K&R C-Programmiersprachenbuch und verwende Zeiger, um die strindex-Funktion anstelle der Array-Notation zu schreiben. Ich habe ein seltsames Problem: Wenn ich an einer der beiden Stellen in meinem Code unten eine printf()-Anweisung einfüge, gibt die Funktion den richtigen Index zurück (in diesem Fall 6), aber wenn ich die printf()-Anweisungen weglasse, gibt die Funktion -1 zurück.

Ich kann wirklich nicht verstehen, warum dies überhaupt einen Unterschied machen sollte und wäre für jede Klarstellung dankbar. Hier ist mein Code:

#include <stdio.h>

int strindex(char *a, char *b) {

    char *pa;
    char *astart = a;
    char *pb = b;
    int len;

    while(*pb++ != '\0')
        len++;

    while(*a != '\0') {
        pa = a;
        pb = b;
        for(;*pb != '\0' && *pa == *pb; pa++, pb++)
            ;
        if(len > 0 && *pb == '\0') {
            return a - astart;
        }
        //printf("%c\n", *a);
        a++;
    }
    //printf("%c\n", *a);
    return -1;
}

int main() {

    char *a = "experiment";
    char *b = "me";

    printf("index is %d\n", strindex(a, b));

    return 0;
}

Vielen Dank!

Joe

9voto

schot Punkte 10358

Das Problem ist die automatische Variable len . Da Sie ihn nicht initialisieren, beginnt er mit einem unbestimmten Wert (Müll). Dann wird er inkrementiert, so dass er am Ende 'garbage + Länge von b' ist. Jede einzelne Änderung des kompilierten Codes, wie eine zusätzliche printf Aufruf kann der Startwert von len und damit das Verhalten Ihres Programms ändern.

Die Lösung: int len = 0; und sehen Sie nach, ob Sie weitere Warnungen von Ihrem Compiler erhalten können. Wenn Sie gcc verwenden Sie die -O -Wall -Wextra Flaggen. Dann sollten Sie eine Warnung wie diese erhalten:

strindex.c:8: Warnung: 'len' kann in dieser Funktion uninitialisiert verwendet werden

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X