Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Вопросы начинающего программиста (http://forum.oszone.net/showthread.php?t=29358)

vadimiron 29-09-2004 20:29 203531

Делаю такую переменную: char text[30]. А значение данной переменной должно состоять из занчений двух переменных и плюс просто текст, то есть значение переменной text как бы собирается из разных частей
Как это правильно записать??
text=var1"lalala"var2 конечно не проходит

P.S.:вопросов будет ещё много :)


Добавлено:

А сам разобрался: надо использовать функцию sprintf()

Админам: плиззз, не удаляйте этот топик
Я буду тут свои вопросы задавать

vadimiron 30-09-2004 00:17 203532

Нужно подсчитать количество строчек в файле base.txt
я сделал это так
Код:

int count()
 * * * *{
 * * * * * *FILE *base_stream=fopen("base.txt","r");
 * * * * * *char line[100];
 * * * * * *int i=0;
 * * * * * *while(fgets(line,100,base_stream))
 * * * * * *{
 * * * * * * * *i++;
 * * * * * *} * *
 * * * * * *fclose(base_stream);
 * * * * * *cout<<i; * * * * * *
 * * * *}

Всё работает, а может есть какой нибудь другой способ??
Мне это нужно для расширения кругозора :)

[s]Исправлено: vadimiron, 22:42 29-09-2004[/s]

hasherfrog 30-09-2004 10:24 203533

vadimiron
Для текстовых файлов с длинными строками Ваш метод даст ошибку.

vadimiron 30-09-2004 15:03 203534

hasherfrog
Ну так вопрос как раз звучал:
Цитата:

а может есть какой нибудь другой способ??
:(
А если имеется ввиду число 100, то я просто знаю, что в моём случае строчка не будет длинее ста знаков

ivank 01-10-2004 00:34 203535

Например, можно найти длину файла через fseek/ftell, считать его целиком и посчитать количество '\n'. Если файл не слишко большой и памяти не слишком мало, как обычно и бывает. Даже в рекомендациях по написанию прикладных NetBSD программ утверждается, что такой метод предпочтительней построчного чтения.

Добавлено:

Это самый простой путь.

Можно читать не весь файл за раз, а кусками в буффер. В принципе, в данном случае ничуть не сложней. Хотя при более продвинутой обработке (какой-нибудь, даже примитивный, парсинг итд) это довольно неудобно.

vadimiron 02-10-2004 13:04 203536

Мне нужна такая функция, чтобы из строки вида var1***var2***var3***....  все var вытащить, так как сколько этих var там  будет я не знаю, нужно всё загонять в массив
Если кто программировал на PHP, то нужна функция explode

Есть такое решение
Код:

#include <string>
void explode (char *line, char *delim)
{
    char *result=NULL;
    result=strtok(line,delim);
    while (result!=NULL)
    {
        cout<<result;
        result=strtok(NULL,delim);
    }
}

Эта функция работает и выводит все var, а как мне вместо вывода сделать присваивание очередной result новому элементу массива array
Просто изза того, что все переменные являются строками, то array будет двумерным и я путаюсь, как в этом случае присваивание очередному элементу массива array организовать

ivank 02-10-2004 13:49 203537

vadimiron
Сделай массив std::string'ов.
Или статический массив char array[x][y], если количество строк как и их длинна фиксированы (т.е. не больше x и y-1) и копируй банальным strcpy(array[[i]], result), где i - номер строки. array будет передаваться извне. А результатом будет array и n - количество считанных записей.

А лучше почитай про std::vector/std::list и std::string. С ними всё было бы гораздо проще.


[s]Исправлено: ivank, 13:07 3-10-2004[/s]

vadimiron 02-10-2004 14:08 203538

Всё со стрингом получилось
Вот так:
Код:

void explode (char *line, char *delim)
{
    char *result=NULL;
    result=strtok(line,delim);
    string res[10];
    int i=0;
    while (result!=NULL)
    {
        res[i]=result;
        result=strtok(NULL,delim);
        i++;
    }
}

Теперь функция разбивает строку line вида var1***var2***var3*** на отдельные var и эти var записывает в массив res, *** в этом случае являются delim

Добавлено:

Ещё один вопрос:
Мне надо чтобы массив после его генерации в этой функции был доступен и вне даннго блока, то есть я запускаю функцию explode(line,delim); и потом вызываю поочереди все элементы массива res

Добавлено:

А сам понял, надо string res[10]; вне функции декларировать

vadimiron 05-10-2004 15:45 203539

Как удалить определённую строчку в файле??
Работаю со стрингами и streams с++
Есть массив FILE[size], каждый элемент которого является определённой строчкой файла.
Надо удалить элемент под номером i данного массива и всё оставшееся записать обратно в файл
И i, и size известны
У меня что то это проделать не получается

ivank 06-10-2004 00:14 203540

Код:

for (i = 0; i < size; ++i)
    if (i != to_delete)
        out_file << data[i] << "\n";

i - переменная счётчика цикла. Лучше для других уелей её не применять и выбирать более значащие имена.

А FILE, если не ошибаюсь #define на внутреннию структуру в stdio.h, или просто структура, не уверен. Но главное, что лучше такоей имя не использовать, на всякий пожарный. И вообще, имена большими буквами лучше давать только константам (задефайненым или через enum).

vadimiron 06-10-2004 03:35 203541

Спасибо ivank, я сделал таким же образом, у меня там просто небольшая ошибка была, поэтому сначало не работало :)

vadimiron 12-10-2004 17:37 203542

Хочу начать изучение программирования под Винды и встал такой вопрос: как собственно говоря учить :)
Насколько я понял есть API, две компании сделали из него MFC и OWL для своих двух самых распространнёных компиляторов.
Чтобы стать хорошим программистом, ведь не достаточно уметь программировать в какой то из двух сред, надо и API знать??

hasherfrog 13-10-2004 02:21 203543

vadimiron
Вопрос риторический?
ПС. На самом деле можно быть отличным программистом и при этом ни разу не видеть "окошек отца виндоуза" ;)

vadimiron 20-10-2004 19:51 203544

Программирую на WinAPI
При компиляции появляются две такие ошибки:
1.   [Linker error] undefined reference to `_Z7WinProcP6HWND__jjl@16'
2.   [Linker error] undefined reference to `GetStockObject@4'

Что это такое и как с ним бороться???
Врней что это такое, я вроде догадываюсь, линкер не может что то подсоединить, но изза чего это происходит???

Среда: DevC++, они вроде компилятор от mingw используют, если я правильно понимаю

Добавлено:

С первым я разобрался, моя ошибка, а со вторым не могу
GetStockObject - такая же функция в WinAPI есть, почему таая ошибка может возникнуть?

hasherfrog 21-10-2004 09:22 203545

Вы не подключили системную библиотеку при линковке, имхо. Это функция из GDI, афаик. Не могу точно сказать про DevC++, но кажется, Вы включили "Не использовать стандартные (системные?) библиотеки". Либо Вам надо указать явно при компиляции (точнее, линковке) эту библиотеку. Имя библиотеки можно узнать из справочника по API, там внизу страницы для каждой функции пишут имя хидера, имя библиотеки (ну и ещё что-то :))

vadimiron 21-10-2004 12:10 203546

Да, меня только одно смущает, этот пример я взял из уроков по АПИ, и во всех этих уроках подключается только одна стандартная библиотека <windows.h>, то есть видимо проблема у меня с компилятором
Буду разбираться

vadimiron 21-10-2004 16:20 203547

Объясните мне, как string связан с namespace std??
Без объявления этого namespace-а у меня string не понимаются

[s]Исправлено: vadimiron, 14:21 21-10-2004[/s]

hasherfrog 22-10-2004 09:47 203548

vadimiron
:cranky: Пфффф. Как насчёт книжку по C++ почитать?

vadimiron 22-10-2004 14:42 203549

В моей книжке на этом акцент не делается.
А в примере using namespace std стоит, я думал, это относится к библиотеке iostream, которая подключается к данному примеру, я не знал, что объявление этого namespace также для функционирования стринга нужно.
Так всё же, зачем std для стринга нужен??

hasherfrog
Знаете, так можно вообще весь форум закрыть, а на главной странице написать:"Друзья, смотрите в книжках, там всё есть".
Тема же называется: Вопросы начинающего программиста
Я этим занимаюсь не больше месяца, конечно, я что то важное мог пропустить

ivank 23-10-2004 07:20 203550

Цитата:

Знаете, так можно вообще весь форум закрыть, а на главной странице написать:"Друзья, смотрите в книжках, там всё есть".
Я всеми руками за это прогосовал бы...

string объявлен в namespace std. Всё.

Поэтому и надо указываеть этот неймспейс, либо при объявлении переменных как std::что-то, либо перед объявлением как using std::что-то или using namespace std. А вообще, в нормальной книжке, если рассказывается про std::string, должно бы рассказываться и про то, в какой области имён он объявляется, и про то, что такое namespace "вообще".

[s]Исправлено: ivank, 7:22 23-10-2004[/s]

vadimiron 10-01-2005 00:58 287138

Как сделать, чтобы функция возвращала массив в С или С++
Код:

int func()
{
    int B[6]={0,1,2,3,4,5};
    return B;
}

int C[6]=func();

Как исправить этот код, чтобы он работал?
Там вроде надо как то с пойнтерами поигаться, я в них пока слаб....

hasherfrog 10-01-2005 01:20 287142

Во-о-о-от. А теперь пускай сюда придут люди, которые говорят, что "С круче Дельфи" и расскажут в двух словах, как бы это так хитро сделать, чтобы программа была ясна и понятна...

Netscaper 10-01-2005 01:30 287143

Вот пример.
Код:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int *wrong_func()
{
    int b[6] = {0, 1, 2, 3, 4, 5};
    int *ptr;
    ptr = &b[0];
    return ptr;
}

int *solve_func()
{
    int *b;
    int i;
    b = (int *)malloc(sizeof(int) * 6);
    for (i = 0;i < 6; i++)
        b[i] = i;
    return b;
}

void main()
{
    int *c;
    int i;
    c = wrong_func();
    for(i = 0;i < 6; i++)
        printf("%d ",c[i]);
    printf("\n");
    c = solve_func();
    for(i = 0;i < 6; i++)
        printf("%d ",c[i]);
    printf("\n");
    free((void *)c);
    getchar();   
}

Первая функция wrong_func возвращает указатель на массив, который указывается внутри этой функции. Как видно, возвращается непонятно что. Дело в том, что этот массив создается только для этой функции (я не хочу углублятся в принципы организации памяти) и, следовательно, значения будут иметь место только в ней. Намного проще использовать динамический массив, например, как в функции solve_func, который создается и иницилизируется внутри неё. Дело в том, что динамический массив создается (функция malloc)«глобально» и будет действителен, пока не будет вызвана функция free (будет уничтожен). Надеюсь, понятно изложил. Хотя, всё-таки, присоединяюсь к мнению hasherfrog, про то, что книжки надо читать. Желательно без чьей-либо помощи. Проще говоря, разобраться самому. :yes:

mrcnn 10-01-2005 05:17 287168

Массив полностью вернуть из функции нельзя. Можно напрямую работать с массивом через указатели, тогда необходимость возвращать что-нибудь отпадает. Само имя массива по сути дела - всего лишь указатель.

Пример
Код:

#include<stdio.h>
void copy(int *b, int *c);
void main(){

        int b[5]={0,1,2,3,4};
        int c[5];
        int i;

        copy(b,c);

        for(i=0;i<5;i++)
          printf("%d\n", c[i]);
}

void copy(int *b, int *c){
        int i;
        for(i=0;i<5;i++)
          *(c+i)=*(b+i);}


vadimiron 11-01-2005 23:28 287695

mrcnn
а что значит *(с+i)=*(b+i) ?
c и b - массивы, к элементу массива же вроде так обращаемся: c[i]

hasherfrog 12-01-2005 08:18 287754

vadimiron
Если очень примитивно объяснять, то указатель + целое == указатель[целое]

mrcnn 12-01-2005 08:21 287757

Цитата:

mrcnn
а что значит *(с+i)=*(b+i) ?
c и b - массивы, к элементу массива же вроде так обращаемся: c[i]
Я же сделал пометку, что имя массива по сути дела _указатель_ на первый элемент массива, имя массива с указанием номера элемента - _указатель_ на i элемент массива
таким образом конструкция *(c+i) указывает на i элемент массива c. По сути дела *(c+i) аналогично c[i], а *(с+i)=*(b+i) аналогитчно c[i]=b[i]


Время: 21:00.

Время: 21:00.
© OSzone.net 2001-