Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Почему не хочет работать не пойму


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

#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;
}

Автор: Annuta 6.12.2010, 18:42
Думаю, что надо не укзатель использовать, а массив
Код

#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;
}

У меня работает! 

Автор: Sartorius 6.12.2010, 18:52
Annuta права. Дело в том, что строковые литералы хранятся в read-only участке памяти, а strtok при своей работе модифицирует строку. Так что нужно либо использовать массив, который будет лежать на стеке либо выделять память в куче.

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


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

Автор: newbie2009 6.12.2010, 19:11
Разобрался , все таки я правильно вас понял, не правильно записал вначале просто в коде=)
Код

#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 () вылетает, почему?=(

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

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

Автор: newbie2009 6.12.2010, 19:23
Не-а, проблема не в этом... Ну, ради эксперимента попробывал не помогло

Автор: Crafty 6.12.2010, 21:44
Может проблема в том что не проверяете кол-во передаваемых параметров в консоли.
Код

#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;
}


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

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

Автор: Dov 7.12.2010, 16:25
Ты здесь строку попортил:
Код

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;
    }

Автор: newbie2009 7.12.2010, 21:33
Блин, точно.... СПАСИБО, большое, завтыкал...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)