оператор printf () имеет значение для моего возвращаемого значения? - C Программирование - PullRequest
4 голосов
/ 07 октября 2010

Я экспериментирую с одной из функций в книге «Язык программирования K & R C» и использую указатели для написания функции strindex, а не для обозначения массива.У меня странная проблема: если я включаю оператор printf () в любую из двух точек моего кода ниже, то функция возвращает правильный индекс (в данном случае 6), но если я опущу операторы printf (),функция возвращает -1.

Я действительно не понимаю, почему это должно иметь какое-либо значение и был бы благодарен за любые разъяснения.Вот мой код:

#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;
}

Большое спасибо

Джо

1 Ответ

9 голосов
/ 07 октября 2010

Проблема в автоматической переменной len.Поскольку вы не инициализируете его, оно начинается с неопределенного (мусорного) значения.Затем вы увеличиваете его, чтобы оно получилось как «мусор + длина b».Любое единственное изменение в скомпилированном коде, например дополнительный вызов printf, может изменить начальное значение len и, таким образом, изменить поведение вашей программы.

Решение: int len = 0;, и посмотрите,может получить больше предупреждений от вашего компилятора.Если вы используете gcc, используйте флажки -O -Wall -Wextra.Затем вы должны получить предупреждение вроде:

strindex.c: 8: предупреждение: 'len' может использоваться неинициализированным в этой функции

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...