Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему не хочет работать не пойму 
:(
    Опции темы
newbie2009
Дата 6.12.2010, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 8.2.2009

Репутация: нет
Всего: нет



Вообщем хочу разбить данную строку, что бы потом считать формат файла....
Подскажите как эффективней и почему этот код не хочет работать?
Код

#include <stdio.h>
#include <string.h>

int main ()
{
  char *str = "d://1.txt";
  char *pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str,".");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, ".");
  }
  return 0;
}

PM MAIL   Вверх
Annuta
Дата 6.12.2010, 18:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 3.10.2006
Где: Dubna

Репутация: нет
Всего: 1



Думаю, что надо не укзатель использовать, а массив
Код

#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] = "1.cpp";
  char *pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok(str,".");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, ".");
  }
  return 0;
}

У меня работает! 
--------------------
Программист - это комбинация лени и логики !
PM MAIL   Вверх
Sartorius
Дата 6.12.2010, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 2
Всего: 37



Annuta права. Дело в том, что строковые литералы хранятся в read-only участке памяти, а strtok при своей работе модифицирует строку. Так что нужно либо использовать массив, который будет лежать на стеке либо выделять память в куче.
PM MAIL ICQ   Вверх
newbie2009
Дата 6.12.2010, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 8.2.2009

Репутация: нет
Всего: нет



1. как массив и у меня работает, но надо имменно через указатель.
2. char * strtok ( char * str, const char * delimiters ); ( из мсдн)
  должно работать и как я написал, судя по обїявлению...


Добавлено @ 19:07
Нет, все таки не понял... Не получается. А можете привести пример кода где будет с указателями работать?

Это сообщение отредактировал(а) newbie2009 - 6.12.2010, 19:08
PM MAIL   Вверх
newbie2009
Дата 6.12.2010, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 8.2.2009

Репутация: нет
Всего: нет



Разобрался , все таки я правильно вас понял, не правильно записал вначале просто в коде=)
Код

#include <stdio.h>
#include <string.h>

int main ()
{
    char *test = "d://1.txt";
    char *str = new char[strlen(test)];
    strcpy(str,test);
    
  char *pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str,".");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, ".");
  }
  return 0;
}


Добавлено через 3 минуты и 17 секунд
Код


char *bigFile = argv[1];


char *bigFile1 = new char[strlen(bigFile)];
    strcpy(bigFile1,bigFile);
    printf("%s\n",bigFile1);
    char *pch ;
    pch = strtok(bigFile1,"."); // here error
    char *t1; // разширение файла
        
    while (pch != NULL)
    {
        t1 = pch;
        pch = strtok (NULL, ".");    
    }

Но вот такое код тода уже опять на strtok () вылетает, почему?=(
PM MAIL   Вверх
Sartorius
Дата 6.12.2010, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 2
Всего: 37



Цитата(newbie2009 @  6.12.2010,  20:11 Найти цитируемый пост)
new char[strlen(bigFile)];

мало выделил памяти. Нужен еще 1 байт на '\0'.

PM MAIL ICQ   Вверх
newbie2009
Дата 6.12.2010, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 8.2.2009

Репутация: нет
Всего: нет



Не-а, проблема не в этом... Ну, ради эксперимента попробывал не помогло
PM MAIL   Вверх
Crafty
Дата 6.12.2010, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 12
Всего: 14



Может проблема в том что не проверяете кол-во передаваемых параметров в консоли.
Код

#include <cstdio>
#include <cstring>

int main(int argc, char** argv)
{
    if (argc < 2)
    {
      printf("a few parameters\n");
      return -1;
    }

    char *bigFile = argv[1];
    char *bigFile1 = new char[strlen(bigFile)];
    strcpy(bigFile1,bigFile);
    printf("%s\n",bigFile1);
    char *pch ;
    pch = strtok(bigFile1,"."); // here error
    char *t1; // разширение файла
        
    while (pch != NULL)
    {
        t1 = pch;
        pch = strtok (NULL, ".");    
    }
  return 0;
}


PM MAIL   Вверх
newbie2009
Дата 7.12.2010, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 8.2.2009

Репутация: нет
Всего: нет



Та часть уже заработала...
Теперь не могу понять почему в конце вылетает ошибка, когда вызываешь прогу с консоли... Если пошагово все сделать, то все хорошо....

Ошибка по ходу когда я файл обратно собираю...

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  main.cpp 2,78 Kb
PM MAIL   Вверх
Dov
Дата 7.12.2010, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



Ты здесь строку попортил:
Код

char *pch = strtok(str,".");
char *t1;
    while (pch != NULL)
    {
        t1 = pch;
        pch = strtok (NULL, ".");    
    }


а здесь пытаешься использовать её длину(уже испорченую) и открыть несуществующий файл...
В любом случае, ты мало памяти выделил для  assemblyFileName .
Код
    char *some = "afterAssembly";
    char *assemblyFileName = new char[ strlen(str) ];

    strcpy(assemblyFileName,str);
    strcat(assemblyFileName,"_");
    strcat(assemblyFileName,some);
    strcat(assemblyFileName,".");
    strcat(assemblyFileName,t1);
    
    if ( (file = fopen(assemblyFileName,"wb")) == NULL )
    {
        printf("file %s could not be open\n", assemblyFileName);
        return -1;
    }


Это сообщение отредактировал(а) Dov - 7.12.2010, 16:30


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
newbie2009
Дата 7.12.2010, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 8.2.2009

Репутация: нет
Всего: нет



Блин, точно.... СПАСИБО, большое, завтыкал...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0825 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.