Поиск символа в массиве
Дан массив, в который считываются символы с клавиатуры или файла. Есть функция отвечающая за поиск символа в массиве. Так вот знаю, что ошибки в трёх строчках в коде, но не могу понять, как исправить. Помогите, пожалуйста. Строчки пометил в коде.
#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*