2015-07-02 5 views
0

Я написал алгоритм для извлечения слов из строки и хранения их в массиве, однако я получаю нежелательный результат, и я не могу понять, почему. вывод - очень странные персонажи.Программа печатает мусор вместо фактического возвращаемого значения из вызова функции

#include <stdio.h> 
#include <windows.h> 

char *extract(char *String) 
{ 
char str[10][20]; 
int x = -1,y = 0,z = 0; 
for(size_t n = 0 ; n < strlen(String) ; n++) 
{ 
    y++; 
    if(String[n] == ' ') y = 0, z = 0; 

    if(y == 1) x++; 

    if(y > 0) 
    { 
     str[x][z] = String[n]; 
     z++; 
     str[x][z] = '\0'; //Comment this********* 
    } 
} 

/*for(int n = 0; n < 10; n++) Uncomment this***** 
{ 
    str[n][3] = '\0'; 
}*/ 

    return str[7]; 
} 

int main() 
{ 
    printf("WORD : %s\n",extract("POL POL POL POL POL POL POL POL POL POL")); 
    system("PAUSE"); 
    return 0; 
} 

где ошибка в коде?

Примечание: я также получаю странные символы, когда я использую printf и strlen где-то в другом месте.

ответ

7

Проблема, которую я вижу здесь, str является локальной переменной для функции extract(), и вы пытаетесь вернуть ее адрес и используете это возвращаемое значение в качестве аргумента для printf(). Он вызывает UB.

Чтобы уточнить, str будет существовать до extract() завершает выполнение. Как только он завершит выполнение и вернется к вызывающему абоненту, не будет никакого существования str. Таким образом, возвращаемый указатель укажет на недействительный адрес памяти. Использование этого значения повторного использования приведет к undefined behaviour.

+0

Вот рабочий пример без UB, который копирует результат в выходной буфер: http://ideone.com/54aZh0 – AndyG

Смежные вопросы