Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.12.2021, 23:15   #1
Alexandrietz
Пользователь
 
Регистрация: 30.11.2017
Сообщений: 15
По умолчанию Проблема с выводом символом на экран.

Есть проблема с выводом символом на экран. Когда посимвольно считываю строку из файла, то выскакивает символ "?" в прямоугольнике. Замена кодировки к Windows-1251 или UTF-8 ни к чему не привела.
Код:
// Для решения задачи вам нужно ввести строки с помощью функций gets или fgets, разбить строку на слова и выбрать нужные (функция scanf
// с форматом %s вводит строку до пробела, но в данной задаче вам не нужно так делать!). Стандартные функции работы со строками НЕ 
// использовать! Обратите внимание, что во всех случаях слова могут разделяться любым(!) количеством символов, не относящихся к слову
// (будем считать, что к слову относятся большие и маленькие латинские буквы и цифры). Желательно всю обработку выполнить за один проход 
// строки, хотя это возможно не во всех вариантах. Обязательно проверить работу программы на пустой строке и на строке, состоящей только из 
// символов, не относящихся к слову. Сформировать строку, добавляя к каждой заданной подстроке другую заданную подстроку.

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

#define _CRT_SECURE_NO_WARNINGS

int DefineSize(FILE* file);
void ReadStr(FILE* file, char* str);
char* FormNewStr(char* str_one, int n_one, char* str_two, int n_two, char* str_three, int n_three);
int FindSubstr(char* str, int n, char* substr, int ns);
char* Concat(char* str, int n, char* substr, int ns, int index);
void Show(char* str);

int main(int argc, char* argv[])
{
	FILE* file_one, * file_two, * file_three;
	char* str_one, * str_two, *str_three, *new_str;
	int n_one, n_two, n_three;

	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);

	setlocale(LC_ALL, "rus");

	if (argc < 3)
	{
		printf("Недостаточное число параметров.\n");
		return 0;
	}

	fopen_s(&file_one, argv[1], "r");
	fopen_s(&file_two, argv[2], "r");
	fopen_s(&file_three, argv[3], "r");
	if (file_one == nullptr || file_two == nullptr || file_three == nullptr)
	{
		printf("Не все файлы находятся в директории проекта.\n");
		return 0;
	}
	else
	{
		if (feof(file_one) || feof(file_two) || feof(file_three)) 
                { 
                    fclose(file_one); 
                    fclose(file_two); 
                    fclose(file_three); 
								
                    printf("Какие-то текстовые файлы пустые.\n"); 
                
                    return 0; 
                }
		else
		{
			fseek(file_one, 0, SEEK_CUR);
			fseek(file_two, 0, SEEK_CUR);
			fseek(file_three, 0, SEEK_CUR);

			n_one = DefineSize(file_one);
			str_one = (char*)malloc(sizeof(char) * n_one);

			n_two = DefineSize(file_two);
			str_two = (char*)malloc(sizeof(char) * n_two);

			n_three = DefineSize(file_three);
			str_three = (char*)malloc(sizeof(char) * n_three);

			fseek(file_one, 0, SEEK_CUR);
			fseek(file_two, 0, SEEK_CUR);
			fseek(file_three, 0, SEEK_CUR);

			ReadStr(file_one, str_one);
			ReadStr(file_two, str_two);
			ReadStr(file_three, str_three);

			fclose(file_one);
			fclose(file_two);
			fclose(file_three);

			Show(str_one);
			Show(str_two);
			Show(str_three);

			new_str = FormNewStr(str_one, n_one, str_two, n_two, str_three, n_three);

			Show(new_str);

			free(str_one);
			free(str_two);
			free(str_three);
			free(new_str);

			return 0;
		}
	}
}

int DefineSize(FILE* file)
{
	int n = 0;
	char ch;

	while (ch = fgetc(file) != EOF)
	{
		n++;
		printf("%c ", ch);
	}
	printf("\n");

	return n;
}

void ReadStr(FILE* file, char* str)
{
	int counter = 0;
	char ch;

	while (ch = fgetc(file) != EOF)
	{
		str[counter] = ch;
		counter++;
	}
}

char* FormNewStr(char* str_one, int n_one, char* str_two, int n_two, char* str_three, int n_three)
{
	if (str_one != nullptr && str_two != nullptr && str_three != nullptr)
	{
		int index = FindSubstr(str_one, n_one, str_two, n_two);
		char* new_str = str_one;

		while (index != -1)
		{
			char* auxilary_str = (char*)malloc(sizeof(char) * (n_one - index - n_two));

			if (auxilary_str != nullptr)
			{
				for (int i = index + n_two; i < n_one; i++)
				{
					auxilary_str[i - index - n_two] = str_one[i];
				}

				new_str = Concat(str_one, n_one, str_three, n_three, index);
				index = FindSubstr(auxilary_str, n_one - index - n_two, str_two, n_two);
			}
		}

		return new_str;
	}
	else
	{
		return nullptr;
	}
}

int FindSubstr(char* str, int n, char* substr, int ns)
{
	if (ns > n)
	{
		return -1;
	}
	else
	{
		bool flag = true;

		for (int i = 0; i < n - ns + 1; i++)
		{
			for (int j = 0; j < ns; j++)
			{
				if (str[j + i] != substr[j])
				{
					flag = false;
				}
			}

			if (flag)
			{
				return i;
			}
		}

		return -1;
	}
}

char* Concat(char* str, int n, char* substr, int ns, int index)
{
	char* new_str = (char*)malloc(sizeof(char) * (n + ns));

	if (new_str != nullptr)
	{
		for (int i = 0; i < index; i++)
		{
			new_str[i] = str[i];
		}

		for (int i = index; i < index + ns; i++)
		{
			new_str[i] = substr[i - index];
		}

		for (int i = index + ns; i < n; i++)
		{
			new_str[i] = str[i];
		}

		return new_str;
	}
	else
	{
		return nullptr;
	}
}

void Show(char* str)
{
	if (str == nullptr)
	{
		printf("Строка пуста.\n");
	}
	else
	{
		int counter = 0;

		while (str[counter] != '\0')
		{
			printf("%c ", str[counter]);
			counter++;
		}
		printf("\n");
	}
}
Код:
//file_one.txt
qwcd

//file_two.txt
cd

//file_three.txt
345
Результат отладки на 81-ой строчке(см. фото).
Объясните мне, тупице, где я что не так делаю? Кодировки менял и в блокноте, и здесь. Бесполезно. Что не так-то? Меня даже не так волнует, правильно ли я сделал задание, но вот стопр на этом...
Изображения
Тип файла: png Screenshot_1.png (6.4 Кб, 10 просмотров)

Последний раз редактировалось Alexandrietz; 24.12.2021 в 23:23.
Alexandrietz вне форума Ответить с цитированием
Старый 25.12.2021, 00:57   #2
Alexandrietz
Пользователь
 
Регистрация: 30.11.2017
Сообщений: 15
По умолчанию

Будто консоль издевается надо мною смайликами
Изображения
Тип файла: png Screenshot_2.png (7.1 Кб, 10 просмотров)
Alexandrietz вне форума Ответить с цитированием
Старый 25.12.2021, 16:04   #3
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,318
По умолчанию

Есть несколько мест, в которых можно сделать настройку.
Не знаю как это скажется на вашей программе, но:
1. Откройте окно командной строки:
а) Пуск -> набираем команду "cmd" и жмём Enter. Или Win + R и набираем cmd.
б) Верхний левый угол окна: Правый клик - Свойства. Ставим шрифт Lucide Console.

2. Дважды кликаем по текстовому файлу и он открывается в Блокноте.
Смотрим нижний правый угол окна Блокнота.
Если там UTF-8 или что-то другое, то:
"Файл" - "Сохранить как..." и выбрать ANSI кодировку.
На вашем рисунке символы отстоят на одно знакоместо, т.е. там один символ - два байта.
Проверьте размер файла: Правый клик на файле - Свойства. Размер в байтах должен совпадать с числом байтов, для ANSI кодировки.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с выводом на экран Александр222 Помощь студентам 7 19.10.2020 18:42
Проблема с выводом на экран AterAvi Общие вопросы C/C++ 0 06.04.2012 13:15
Проблема с выводом текста на экран JoBl Win Api 9 24.01.2012 01:56
проблема с выводом на экран Sined121 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 08.05.2010 16:48
Проблема с выводом на экран NeveX Общие вопросы .NET 3 20.12.2009 13:57