Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Ошибка при копировании строк

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

Excell



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот програмка, что-то не хочет копировать стоки из одной области в другую:

Код:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
int i;
char *p1="Bla-bla-bla";
char *p2;
if (NULL == (p2=malloc(strlen(p1)+1)))
{
printf ("It's enough of memory!");
getch();
exit(1);
}
for (i=0;i<strlen(p1);i++)
*(p2+i)=*(p1+i);
printf ("%s\n",p2);
free(p2);
getch();
}

может что-то не так делаю?
компилятор ругается так:
Цитата:
cannot convert from 'void *' to 'char *'

на строке где p2=malloc...

----------
Построю лабиринт, в котором смогу затеряться с тем, кто захочет меня найти... Кто это сказал и о чем?

Всего записей: 1554 | Зарегистр. 31-08-2002 | Отправлено: 19:05 27-01-2005
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
VC 7.0
 

Код:
 
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
int i;
char *p1="Bla-bla-bla\0"; //на всякий случай
char *p2 = NULL;  // --"--"--
 
 
if (NULL == (p2=(char*)malloc(strlen(p1)+1)))
{
printf ("It's enough of memory!");
getch();
exit(1);
}

/* на фиг?
for (i=0;i<strlen(p1);i++)
*(p2+i)=*(p1+i);

p2[strlen(p1)] = 0; //тем более, что без этой строки неверно! или в цикле надо ставить i<=strlen(p1)
*/
 
 
strcpy(p2, p1);
 
printf ("%s\n",p2);
free(p2);
getch();
}
 

 
а что за компилятор?

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 19:15 27-01-2005 | Исправлено: akaGM, 19:32 27-01-2005
Excell



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM

Цитата:
if (NULL == (p2=(char*)malloc(strlen(p1)+1)))  

это типа принудительно делаем char*?

Цитата:
на фиг?

просто, намеренно не использовал strcpy

Цитата:
а что за компилятор?

MS VC++6

----------
Построю лабиринт, в котором смогу затеряться с тем, кто захочет меня найти... Кто это сказал и о чем?

Всего записей: 1554 | Зарегистр. 31-08-2002 | Отправлено: 19:33 27-01-2005
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
это типа принудительно делаем char*?  

это типа хороший тон, кот. иногда помогает избежать ошибок...
 

Цитата:
просто, намеренно не использовал strcpy

 
ну тогда юзай красный код в комментах...
 
под VC 6.0 тоже все ок...

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 19:36 27-01-2005 | Исправлено: akaGM, 19:38 27-01-2005
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Excell

Цитата:
компилятор ругается так:  
Цитата:cannot convert from 'void *' to 'char *'  

файл имеет расширение .cpp и программа компилится как cpp вот компилятор и ругается - С++ типизированный язык. Или привидение типов или поставь расширение файла .с и компилируй как С или используй new

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 12:28 28-01-2005
Excell



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
да, спасибо, я красные и ипользовал, все уже работает
спасибо, за подсказки..

----------
Построю лабиринт, в котором смогу затеряться с тем, кто захочет меня найти... Кто это сказал и о чем?

Всего записей: 1554 | Зарегистр. 31-08-2002 | Отправлено: 00:16 30-01-2005
Excell



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот у меня такой вопрос. Вот прога, она делает в текстовых файлах табуляцию каждой строчки.
Нужно указать 3 параметра при запуске вида: program.exe file2.txt file2.txt
первый - прога, второй - файл, которого табулируем, третий - в который..
так вот, если выходной файл не существует, то вылетает ошибка, а если он есть, все ок.
вот исходник:

Код:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define size 200
void main (int a, char *b[])
{
char buf[size];
int notexist,ans;
FILE *in,*out;
if (a<3)
{
puts ("You must insert 3 parameters in command line at least!");
getch();
exit(1);
}
in=fopen(b[1],"rb");
if (in == NULL)
{
printf ("File %s is not exist!",b[1]);
getch();
exit(1);
}
notexist=0;
if ((out=fopen(b[2],"rb")) == NULL)
{
notexist=1;
fclose(out);
}
if (notexist)
{
out=fopen(b[2],"wb");
}
else  
{
printf ("Delete %s, Y/N?",b[2]);
ans=getchar();
if (ans == 'Y' || ans == 'y')
out=fopen(b[2],"wb");
else exit(1);
}
buf[0]='\t';
while (fgets(buf+1,size-1,in) != NULL)
fputs(buf,out);
fclose(in);
fclose(out);
getch();
}
 

что не так?


----------
Построю лабиринт, в котором смогу затеряться с тем, кто захочет меня найти... Кто это сказал и о чем?

Всего записей: 1554 | Зарегистр. 31-08-2002 | Отправлено: 22:11 30-01-2005
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
фиг его знает...
навскидку вот так надо поправить:

Код:
 
Код:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define size 200
void main (int a, char *b[])
{
char buf[size];
int notexist,ans;
FILE *in,*out;
if (a<3)
{
puts ("You must insert 3 parameters in command line at least!");
getch();
exit(1);
}
in=fopen(b[1],"rb");
if (in == NULL)
{
printf ("File %s is not exist!",b[1]);
getch();
exit(1);
}
notexist=0;
if ((out=fopen(b[2],"rb")) == NULL)
{
notexist=1;
//fclose(out); на фиг его закрывать -- его же нет?  
}
if (notexist)
{
out=fopen(b[2],"wb");
}
else  
{
printf ("Delete %s, Y/N?",b[2]);
ans=getchar();
if (ans == 'Y' || ans == 'y')
out=fopen(b[2],"wb");
else exit(1);
}
buf[0]='\t';
while (fgets(buf+1,size-1,in) != NULL)
fputs(buf,out);
fclose(in);
fclose(out);
 
 
printf("\ndone!\npress a key..."); //не забывай сообщать, а то ждешь, ждешь... гы
 
 
getch();
}
 
 

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 22:38 30-01-2005 | Исправлено: akaGM, 22:42 30-01-2005
MoKC0DeR



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
 

Код:
 
if ((out=fopen(b[2],"rb")) == NULL)  
{  
notexist=1;  
//fclose(out); на фиг его закрывать -- его же нет?  
}  
 

 

имхо правильнее

Код:
 
if ((out=fopen(b[2],"rb")) == NULL)  
    notexist=1;  
else
    fclose(out);
 

 

Всего записей: 510 | Зарегистр. 31-03-2004 | Отправлено: 23:04 30-01-2005 | Исправлено: MoKC0DeR, 23:05 30-01-2005
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
согласен...
 
но тогда уж лучше (оптимальнее по крайней мере) делать так
(красное добавить, зеленое -- убрать...) :

Код:
 
...
notexist=0;
 
 notexist = ((out=fopen(b[2],"rb")) == NULL);
 
if (notexist)
{
out=fopen(b[2],"wb");
}
else  
{
 fclose(out);
printf ("Delete %s, Y/N?",b[2]);
ans=getchar();
if (ans == 'Y' || ans == 'y')
out=fopen(b[2],"wb");
else exit(1);
}
 

 
гы

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 23:35 30-01-2005 | Исправлено: akaGM, 23:42 30-01-2005
Excell



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
MoKC0DeR
ла, все ок! работает на ура!  
я тоже думал, что что-то не тк с fclose, ибо отладка на него посылала

----------
Построю лабиринт, в котором смогу затеряться с тем, кто захочет меня найти... Кто это сказал и о чем?

Всего записей: 1554 | Зарегистр. 31-08-2002 | Отправлено: 09:17 31-01-2005
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
тогда держи еще один удар ака критику...
 
юзабилити или хороший стиль...
 

Код:
puts ("You must insert 3 parameters in command line at least!");  

 
все понятно...
что такое третий параметр -- текущее время в секундах, текущая Т в град. Цельсия?
 
в таких случаях пишут как-то вот так:
 

Код:
printf("\n\tUSAGE: program.exe input_file [output_file]\n");

 
и параметров коммандной строки получается 2, а не 3...
 

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 15:21 31-01-2005 | Исправлено: akaGM, 18:23 31-01-2005
Excell



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM

Цитата:
и параметров коммандной строки получается 2, а не 3...  

ну тогда на этот счет у меня есть такой аргумент (программа выполняет такую же операцию, но только во входной файл):

Код:
 
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define size 200
void main (int a, char *b[])
{
char buf[size];
int act;
FILE *in, *tmp;
if (a<2)
{
puts("You must insert 2 parameters in command line at least!");
getch();
exit(1);
}
in=fopen(b[1],"r+b");
if (in == NULL)
{
printf ("File %s is not exist!",b[1]);
getch();
exit(1);
}
tmp=tmpfile();
buf[0]='\t';
while (fgets(buf+1,size-1,in) != NULL)
fputs(buf,tmp);
rewind(in);
rewind(tmp);
do
{
act=fread(buf,1,size,tmp);
fwrite(buf,1,act,in);
}
while (act == size);
fclose(in);
fclose(tmp);
puts ("Operation finished successfully!");
getch();
}
 
 
 


----------
Построю лабиринт, в котором смогу затеряться с тем, кто захочет меня найти... Кто это сказал и о чем?

Всего записей: 1554 | Зарегистр. 31-08-2002 | Отправлено: 10:24 01-02-2005
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
я не понял, аргумент чего?
 
параметрами (аргументами) коммандной строки называюся параметры (гы), которые передаются в программу...
сама программа (имя исполнимого файла) при этом считается аргументом_номер_0, но не является параметром -- так просто принято считать...

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 16:12 01-02-2005
Excell



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM

Цитата:
сама программа (имя исполнимого файла) при этом считается аргументом_номер_0, но не является параметром -- так просто принято считать...

все, понял. о чем ты...
кста, вот еще посмотри прогу, что-то не компилится он а у меня, застревает, на красном моменте, она выводит на экран слова в алфавитном порядке.

Код:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#define size 200
void sort (char *, int);
void main (int argc, char *argv[])
{
char buf[size], *str[100];
int i,num;
FILE *in;
if (argc<2)
{
puts("Слишком мало параметров!");
getch();
exit(1);
}
in=fopen(argv[1],"r+b");
if (in == NULL)
{
printf ("File %s is not exist!",argv[1]);
getch();
exit(1);
}
i=0;
while (fgets(buf,size-1,in) != NULL)
{
str[i]=(char*)malloc(strlen(buf)+1);
strcpy(str[i],buf);
i++;
}
i=num;
sort(*str[],i);
for (i=0;i<num;i++)
printf ("%s",str[i]);
getch();
}
void sort (char *s[], int n)
{
char *tmp;
int i,j,mm;
for (i=n-1;i>=1;i--)
{
mm=0;
for (j=1;j<=i;j++)
if (strcmp(s[j],s[mm])>0)
mm=j;
tmp=s[i];
s[i]=s[mm];
s[mm]=tmp;
}
}
 

 
 

----------
Построю лабиринт, в котором смогу затеряться с тем, кто захочет меня найти... Кто это сказал и о чем?

Всего записей: 1554 | Зарегистр. 31-08-2002 | Отправлено: 22:28 01-02-2005 | Исправлено: Excell, 22:41 01-02-2005
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ну смотри внимательнее на варнинги и ошибки во время компиляции...
 

Код:
 
void sort (char *, int);
void sort (char *s[], int n);
 

два разных прототипа...
 

Код:
 
sort(*str[],i);
 

я не знаю что ты хочешь, но так неверно и все зависит от
твоего определения sort()...
или
sort(str,i);
или
sort(&(*str),i);
что одно и тоже...

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 23:03 01-02-2005
Excell



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM

Цитата:
все зависит от  
твоего определения sort()...  

sort должна принимать массив указателей
а как тогда нужно обозначить прототип?
void sort (char *[], int)
так что ли?
 
Добавлено:
ничего не вышло
довольно трудно разобраться с этими указателями, но очень мощные они...

----------
Построю лабиринт, в котором смогу затеряться с тем, кто захочет меня найти... Кто это сказал и о чем?

Всего записей: 1554 | Зарегистр. 31-08-2002 | Отправлено: 10:11 02-02-2005
nobody2

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
У тебя ж есть массив указателей:

Код:
 void main (int argc, char *argv[])  


Всего записей: 223 | Зарегистр. 15-07-2003 | Отправлено: 12:12 02-02-2005
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
правильно...
массив указателей
proc (char * s[]);
только в объявлении!
а в вызове -- proc(s) (сам массив)
 
говорю ж:
следи за варнингами!
 

Код:
 
warning C4700: local variable 'num' used without having been initialized
 

 

Код:
 
i=num; //???
sort(str,i);
 

 
вот тебе пожалуйста -- ошибка в логике программы, разбирайся...

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 14:20 02-02-2005
Excell



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
ой, точно...
надо же num=i;
конечно!!!
спасибки
 
Добавлено:
что-то я ковыряюсь и ковыряюсь, а сортировка, что-то не работает и не работает, прога печатает слова на экран, но не отсортированные, вот я другую прогу написал, с использование указателя на функцию, результат тот же

Код:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#define size 200
void sort (char *[], int, int (*cmp)(char *, char *));
int cmplen (char *, char *);
void main (int argc, char *argv[])
{
char buf[size], *str[100];
int i,num;
FILE *in;
if (argc<2)
{
puts("Слишком мало параметров!");
getch();
exit(1);
}
in=fopen(argv[1],"r+b");
if (in == NULL)
{
printf ("File %s is not exist!",argv[1]);
getch();
exit(1);
}
i=0;
while (fgets(buf,size-1,in) != NULL)
{
str[i]=(char*)malloc(strlen(buf)+1);
strcpy(str[i],buf);
i++;
}
num=i;
sort(str,i,&cmplen);
for (i=0;i<num;i++)
printf ("%s\n",str[i]);
getch();
}
void sort (char *s[], int n, int (*cmp)(char *, char *))
{
char *tmp;
int i,j,mm;
for (i=n-1;i>=1;i--)
{
mm=0;
for (j=1;j<=i;j++)
if ((*cmp)(s[j],s[mm])>0)
mm=j;
tmp=s[i];
s[i]=s[mm];
s[mm]=tmp;
}
}
int cmplen(char *s1, char *s2)
{
return (strlen(s1)-strlen(s2));
}
 

 
Добавлено:
сортировка по возрастанию длины строки

Всего записей: 1554 | Зарегистр. 31-08-2002 | Отправлено: 16:26 02-02-2005 | Исправлено: Excell, 19:04 02-02-2005
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Ошибка при копировании строк


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru