Вопрос № 44221: Доброго времени суток уважаемые эксперты. Работаю на Turbo C++ 3. Подскажите пожалуйста, как можно разбить массив типа char (например "20 5 1000 36 1") в массив int, используя пробел как разделитель значений? Есть ли для этого какие нибудь ...Вопрос № 44226: Уважаемые эксперты, подскажите какие нибудь сайты, где можно посмотреть исходники реальных программ, с приминением наследования! А то курсовую пишу! =)
Заранее примногоблагодарен!...Вопрос № 44270: Добрый день.
Пожалуйста помогите.
При чтении из файла проблема.добавляется мусор.
Думаю из кода все ясно.
Заранее спасибо...
Вопрос № 44.221
Доброго времени суток уважаемые эксперты. Работаю на Turbo C++ 3. Подскажите пожалуйста, как можно разбить массив типа char (например "20 5 1000 36 1") в массив int, используя пробел как разделитель значений? Есть ли для этого какие нибудь готовые функции или надо писать алгоритм самому? Заранее очень благодарен.
для этого прекрасно подходит strtol (или strtod если числа с плавающей точкой).
я делаю примерно так.
учтите что исходная строка будет модифицирована. поэтому если необходимо что бы исходная строка не пострадала можно сделать копию (strdup) и не забыть потом освободить память free();
Приложение:
Ответ отправил: Ramok (статус: 2-ой класс)
Ответ отправлен: 25.05.2006, 18:21
Отвечает: Vest
Здравствуйте, Рязанов Максим Валерьевич!
Есть стандартная функция:
#include <string.h>
char *strtok(char *s1, const char *s2);
принимающая в качестве аргументов ссылку на строку, где надо разделить, и строку содержащую список разделителей. Вторичный вызов этой функции с s1 == NULL делит эту строку на подстроки. Но идея в том, что строки разделяются с помощью
--------- Халявы не бывает
Ответ отправил: Vest (статус: 2-ой класс)
Ответ отправлен: 25.05.2006, 19:45
Отвечает: Селиванов Александр Владимирович
Здравствуйте, Рязанов Максим Валерьевич!
Скорее всего самому.
Например вот так:
int convert(char str[], int *mc)
{
int i, n(0), l(strlen(str));
// конвертируем
mc[0] = 0;
for(i = 0; i < l; i++)
if(str[i] == ' ')
mc[++n] = 0;
else
mc[n] = mc[n] * 10 + str[i] - '0';
// возвращаем количество сконвертированных чисел (фактический размер массива)
return n + 1;
}
Уважаемые эксперты, подскажите какие нибудь сайты, где можно посмотреть исходники реальных программ, с приминением наследования! А то курсовую пишу! =)
Заранее примногоблагодарен!
Отправлен: 25.05.2006, 18:42
Вопрос задал: Twist (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 4)
18455 реальных проектов написанных на C++. исходники доступны на этом сайте.
Ответ отправил: Ramok (статус: 2-ой класс)
Ответ отправлен: 25.05.2006, 18:57
Отвечает: Morgion
Здравствуйте, Twist!
См. пример из MSDN.
Суть в sscanf. sscanf- сканирует строку и разбирает её в соотв. с форматом.
char a[]="123 32 45 434";
int i[4];
sscanf(a,"%d %d %d %d",&i[0],&i[1],&i[2],&i[3])
или более компактно
sscanf(a,"%d %d %d %d",i,i+1,i+2,i+3)
Недостаток в том, что в таком случае неужно знать ко-во элементов в строке. Если количество
значений, которые будут считаны неизвестны, то обработчик усложится, но не н
а много.
Приложение:
Ответ отправил: Morgion (статус: Студент)
Ответ отправлен: 26.05.2006, 09:17
Вопрос № 44.270
Добрый день.
Пожалуйста помогите.
При чтении из файла проблема.добавляется мусор.
Думаю из кода все ясно.
Заранее спасибо
Приложение:
Отправлен: 26.05.2006, 10:16
Вопрос задал: Kos (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Red Devil
Здравствуйте, Kos!
На это напарываются все. В свое время и я это не мог понять, пока мне на форуме не объяснили. Дело в том, что при считывании через fstream классы, нужно дополнительно проверять состояние на конец файла.
fstream считывает побайтово и поэтому в момент последнего считывания еще не достигает конца файла, т.е. байта указывающего на конец файла. Нужно после каждого считывания проверять дошли ли мы до конца, в коде это выражается в виде одной проверки:
file.read(...); // считали данные
if (file.eof()) break; //выходим, обычно выход из происходит из цикла и поэтому break
Дополненный рабочий код цикла в приложении.
Приложение:
--------- Есть 10 типов людей: те, кто знаком с двоичной системой, и те, кто нет.
Ответ отправил: Red Devil (статус: Студент)
Ответ отправлен: 26.05.2006, 16:23 Оценка за ответ: 5 Комментарий оценки: В точку!!! Спасибо.
Отвечает: Zitz
Здравствуйте, Kos!
На самом деле туда ничего не записывается, мусор там уже есть при объявлении
У Вас просто выводится лишний раз
while(!fon.eof())
{
fon.read((char*)&num[i],sizeof(Men));
cout<
i++;
}
На последнем шаге функция read ничего не считывает, т.к. достигла конца файла, т.е. num[i] ничем не заполняется (а так как Вы его не инициализовали, там находится мусор), а ниже все равно выводится. Нужно вставить проверку на конец файла после функции read. Т.е. цикл нужно переделать.
--------- Успех неизбежен
Ответ отправил: Zitz (статус: Студент)
Ответ отправлен: 26.05.2006, 16:23 Оценка за ответ: 5 Комментарий оценки: Спасибо
Отвечает: Vest
Здравствуйте, Kos!
Проблема интересная, я сам с ней сталкивался. Посмотри, если выполнять программу по шагам, то цикл выполняется на 1 раз больше, чем должен был быть. Идея заключается в том, что после считывания 3-го числа (12), цикл ещё НЕ заканчивается, т.к. бит признака конца файла не устанавливается в "один". В четвёртый раз (когда считывать нечего) считывается уже 0 байт (проверь это, вызвав функцию gcount()), то только тогда eof() == true, т.е. твой цикл можно немного изменить так:
while(!fon.eof())// вот здесь заковыка, на последнем шаге выбрасывается trash!!!
{
fon.read(reinterpret_cast<char*>(&num[i]), sizeof(Men));
if (fon.eof()) // чтобы он прервался раньше, чем ты выведешь несуществующее число
break;
cout << num[i] << " ";
i++;
}
--------- Халявы не бывает
Ответ отправил: Vest (статус: 2-ой класс)
Ответ отправлен: 26.05.2006, 20:50 Оценка за ответ: 5 Комментарий оценки: Спасибо!