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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2010, 16:56   #1
Dagas
 
Регистрация: 02.06.2010
Сообщений: 3
По умолчанию Вывод лишнего символа. Консольное приложение I/O.

Доброго времени.
Пытаюсь написать программку для ввода массива строк.

Код:
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <conio.h>

int main(int argv, char** argc){

	char* buffer[1024];
	int buffer_len = 1024;
	int bytecount;
	int c;

	for(;;){
		int i;
		for(i = 0; i < sizeof(buffer) - 1; i++) {
			if((c = getch()) != '\n') {
				buffer[i] = c;
			} else {
				break;
			}
		}

        if (strcmp(buffer, "exit") == 0)
        {
            break;
		} else {
			print("You say: %s \n", buffer);
			buffer = NULL;
		}
}
На выходе получается рабочее консольное приложение, которое выводит на экран введенную строку с дополнительным текстом. Среда - MS VC++ 2008 Express. Но есть какая-то непонятная мне проблема, а именно: при вводе строки, имеющей длину меньше, чем была длина предыдущей, к ней дописывается 1 лишний символ, который был в той, более длинной строке. Например вводим 123, вывод 123, вводим следом 45, вывод 453, тройка из предыдущей строки. И такое наблюдается всякий раз, когда строка была короче предыдущей. А при попытке ввода пустой строки все равно будет выводиться хотя бы 1 символ.
Кто нибудь может подсказать, где в коде у меня ошибка?
P.S. Опыт С++ не большой, больно не бейте по голове, пожалуйста.
Dagas вне форума Ответить с цитированием
Старый 02.06.2010, 17:00   #2
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

Цитата:
Сообщение от Dagas Посмотреть сообщение
Доброго времени.
P.S. Опыт С++ не большой, больно не бейте по голове, пожалуйста.
Используйте std::cin/std::cout, std::vector, ну и std::string и не майтесь дурью, раз у вас плюсы, помогает.
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Старый 02.06.2010, 17:22   #3
Dagas
 
Регистрация: 02.06.2010
Сообщений: 3
По умолчанию

Код:
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <conio.h>

int main(int argv, char** argc){

	string str;
	int c;

	for(;;){
		int i;
		for(i = 0; ; i++) {
			if((c = getch()) != '\n') {
				std::str.append(c);
			} else {
				break;
			}
		}

		if (strcmp(std::str.data(), "exit") == 0)
        {
            break;
		} else {
			print("You say: %s \n", std::str.data());
			std::str.clear();
		}
}
Переписал с помощью рекомендованных оборотов. Согласен, так понятнее, но проблема не решилась. По прежнему дорисовывает лишний символ в хвост.
Dagas вне форума Ответить с цитированием
Старый 02.06.2010, 23:47   #4
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

Опять же, вы не поняли
Код:
#include <string>
#include <iostream>

int main(){
    std::string tmp;
    while(1){
	std::getline( std::cin, tmp );
	if( tmp == "exit" )
	    break;
	else
	    std::cout << "You say : " << tmp << '\n';
    }
}
Так проще, не правда ли ?
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Старый 03.06.2010, 00:37   #5
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Dagas Посмотреть сообщение
Код:
		for(i = 0; i < sizeof(buffer) - 1; i++) {
			if((c = getch()) != '\n') {
				buffer[i] = c;
			} else {
				break;
			}
		}
Раз уж считываете строку таким способом, то не забывайте ставить завершающий ноль в конце строки
Код:
buffer[i] = '\0';
netrino вне форума Ответить с цитированием
Старый 03.06.2010, 11:31   #6
Dagas
 
Регистрация: 02.06.2010
Сообщений: 3
По умолчанию

Цитата:
Сообщение от ozo Посмотреть сообщение
Опять же, вы не поняли
Так проще, не правда ли ?
Спасибо! Ваш код работает как надо, что вы хотели сказать, я вроде бы понял. Буду дальше работать над собой. 8)
Dagas вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Консольное приложение Lag Общие вопросы C/C++ 3 05.05.2010 08:02
Консольное приложение __Demon__ Общие вопросы C/C++ 8 23.10.2009 10:08
Поиск лишнего/иного символа при сравнении двух строк Bezdar Microsoft Office Excel 5 13.11.2008 13:07
консольное приложение user_jasser Общие вопросы Delphi 3 17.10.2008 12:17
Консольное приложение a_priori Общие вопросы Delphi 6 12.03.2008 08:33