Поиск символа в массиве

Дан массив, в который считываются символы с клавиатуры или файла. Есть функция отвечающая за поиск символа в массиве. Так вот знаю, что ошибки в трёх строчках в коде, но не могу понять, как исправить. Помогите, пожалуйста. Строчки пометил в коде.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define PROGRAMSIZE 1024

char funkcPlik (char *TXT)
{
        FILE *file;
        printf("Podaj adres pliku: ");
        char adres[256];
        if (fgets(adres, 256, stdin) == NULL) {
        printf("Ma miejsce blad lub został przeczytany EOF");
    }
    else
        {
        /* Usuwamy symbol końca wierza */
        int last = strlen(adres) - 1;

        if (adres[last] == '\n')
            adres[last] = '\0';

        /* Tutaj można przeanalizować wiersz */

        }
    printf("\n");
    if ((file = fopen(adres, "r")) == NULL)
    {
        printf("Nie udalo sie otworzyc pliku, uruchom ponownie! \n");
        return 0;
    }
    else
        {
        while(feof (file) == 0) {
            if (fread(TXT, sizeof(char), PROGRAMSIZE, file) != 0)
                printf("%s", TXT);
        }
        fclose(file);
        }
        return *TXT;
}

char funkcKlawiatura (char *TXT)
{
    printf("Wprowadz tekst z klawiatury: ");
    fgets(TXT, PROGRAMSIZE, stdin);
    printf ("%s", TXT);
    
    return *TXT;
}

char funkcFind (char *TXT)
{
    printf("\nPodaj symbol :");
    char f;
    f = getchar ();
    while (getchar () != '\n') continue;
    
    int last = strlen(TXT) - 1;
    char *symbol = NULL;
    for (int i=0; i <= last && *(TXT+i-1) != f; i++)
    {
        if(*(TXT+i) == f) 
        {*symbol = *(TXT+i); // Эта строчка
            printf("OK");
        }
    }
        for(int i=0; i<=16; i++)
        {
            printf("%c", *(symbol - 8 + i));  // Эта строчка
        }
    return *symbol;   // Эта строчка
}

int main ()
{   
    char * TXT = (char*)calloc(PROGRAMSIZE,sizeof(char));
    printf("Tekst bedzie wprowadzony z pliku 'p', czy z klawiatury 'k': ");
    char c;
    c = getchar ();
    while (getchar () != '\n') continue;
    switch (c)
    {
    case 'p':
        
        funkcPlik (TXT);
        funkcFind (TXT);
        printf ("Znak wystepuje w tym fragmencie: \n");
        for(int i=0; i<=16; i++)
        {
            //printf("%c", (funkcFind (TXT) - 8 + i));
        }
        
    break;
    
    case 'k':
    
        funkcKlawiatura (TXT);
        funkcFind (TXT);
        
    break;
    }
    return 0;
}

Ответы (4 шт):

Автор решения: Sergey

но не могу понять, как исправить.

Сильно подозреваю, что Вы запускаете свою программу под виндой. А там проверка конца строки, как это сделано у Вас:

int last = strlen(adres) - 1;
if (adres[last] == '\n')

не работает... В винде конец строки обозначается двумя (!!!) символами. Вот так: 0x0A0D. А может быть - в обратном порядке, точно не помню. К чему это приведёт - зависит от логики дальнейшей работы вашей программы.

→ Ссылка
Автор решения: Генс
/* немного подретушировал вашу функцию))) 
Смущает выделенный под ввод с клавиатуры
фиксированный объём памяти. 
*/
funkcFind (char *TXT) 
{ 
printf("\nPodaj symbol :"); 
//printf("%s %d %d\n", TXT,strlen (TXT),sizeof(TXT));
char f; 
f = getchar (); 
while (getchar () != '\n') 
continue; 
for (int i=0;i<=strlen(TXT); i++) 
{ 
if((char)TXT[i] == f) 
printf("TXT[%d]=%c\n", i,f); 
} 
return 0;
} 


Теперь не выбивает с ошибкой, а нормально выводит искомые адреса. 
→ Ссылка
Автор решения: JohnDoe
  • \r = CR (возврат каретки) → Используется в качестве нового символа строки в Mac OS перед X
  • \n = LF (Подача строки) → Используется в качестве нового символа строки в Unix/Mac OS X
  • \r\n = CR + LF → Используется в качестве символа новой строки в Windows
→ Ссылка
Автор решения: ivanekovtune

Думаю, Вы ищете эту информацию:

int *ptr;   // объявляем указатель на int;
ptr = &a;   // ptr теперь хранит адрес (показывает) на a;
*ptr = 10;  // по адресу, хранящемуся в ptr, записывается 10,
            // a теперь хранит 10, поскольку это был её адрес;
b = *ptr;   // в b записывается значение, хранящееся по адресу,
            // на который указывает ptr, то есть 10;
c = ptr;    // в c записывается большое число, являющееся адресом,
            // на который показывает ptr, компилятор должен выдать предупреждение;
return *ptr;    // функция вернёт 10, тип функции - int
return ptr;     // функция вернёт указатель, тип функции - int*
→ Ссылка