Почему выводит лишние символы?

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
evgenrpo
Сообщения: 12
Зарегистрирован: 31 май 2009, 21:26
Контактная информация:

Я новичок помогите!!!

Код: Выделить всё

#include <iostream>

using namespace std;
void main()
{
	char str1[20];
	char str2[20];
	char *str3;
	int coun=0;
	FILE *fil;
	fil = fopen("text.txt","r");
	while(!feof(fil))
		{
	fgets(str1,20,fil);
			if(str1[0]=='$')
			{
				for(int i = 1; i <= 20; i++)
				{
					if(str1[i]=='$')
					{
					break;
					}
					else
					{
				    coun++;
					}
				}
				str3 = new char [coun];
				cout<<" coun = "<<coun<<endl;
				for(int i=0;i<coun;i++)
				{
				str3[i] = str1[i+1];
				}
				cout<<str3<<endl;
				delete []str3;
				coun=0;
				}
	}
	fclose(fil);
}
должно вывести на консоть слова которые находятся у файле .txt отмеченный метками $бла-бла$.............$бла-бла$.......... а выводит ищо непонятные.
Изображение
у файле
Изображение
Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

str3 = new char [coun];
cout<<" coun = "<<coun<<endl;
for(int i=0;i<coun;i++)
{
str3 = str1[i+1];
}


Исправь этот код так:

Код: Выделить всё

    str3 = new char [coun+1];
    cout<<" coun = "<<coun<<endl;
    for(int i=0;i<coun;i++)
    {
        str3[i] = str1[i+1];
    }
    str3[count] = '\0';
Или вместо этого используй функцию strcpy.
Поумнеть несложно, куда труднее от дури избавиться.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Еще и
for(int i = 1; i <= 20; i++)
сменить на
for(int i = 1; i < lstrlen (str1) ; i++)
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

А ещё лучше так:

Код: Выделить всё

int len = lstrlen (str1);
for(int i = 1; i < len; ++i)
Вычисление длины строки на каждой итерации цикла не есть гуд :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
evgenrpo
Сообщения: 12
Зарегистрирован: 31 май 2009, 21:26
Контактная информация:

Большое спасибо помогло только так

Код: Выделить всё

str3[coun] = 0;
azrael
Сообщения: 89
Зарегистрирован: 31 май 2009, 15:30
Контактная информация:

Romeo писал(а):А ещё лучше так:

Код: Выделить всё

int len = lstrlen (str1);
for(int i = 1; i < len; ++i)
Вычисление длины строки на каждой итерации цикла не есть гуд :)
Нет предела совершенству :D
Еще лучше будет так:

Код: Выделить всё

const int len = lstrlen (str1);
for(int i = 1; i < len; ++i)
Использование констант вместо переменных там, где это возможно, повышает читабельность в разы :)
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

azrael, смысл был в том, чтобы избавиться от вычисления длины строки в цикле и выиграть на перфомансе. Добавление const несомненно правильно с точки зрения культуры кода, но не улучшает ни перфоманс, ни оптимизирует размер. На фоне невысокой культуры остального кода примера подобное добавление может даже сбить автора с толку, потому я не рискнул более изменять данный цикл, хотя здесь вообще с самого начала напрашивался алгоритм count_if c inline предикатом.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
azrael
Сообщения: 89
Зарегистрирован: 31 май 2009, 15:30
Контактная информация:

Romeo, да я и не критиковал, просто добавил то, что кому-нибудь может быть полезно :)
Ответить