Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Строки и указатели.  (Прочитано 1436 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ov7a

  • Автор темы
  • Любитель
  • *
  • Сообщений: 52
    • Просмотр профиля
Строки и указатели.
« : 22 Сентябрь 2007, 23:11:15 »
Задачка элементарная - склеить 2 "бесконечные" строки в одну.
Реализую:
#include <stdio.h>
#include <stdlib.h>
int main(){
int l1=0,l2=0,ml1=5,ml2=5;
char c,*s1,*s2,*s;
printf("Vvedite s1: ");
s1=(char *)malloc(ml1);
while ((c=getchar())!=10){
l1++;
if (l1=ml1-1) {ml1+=10;s1=(char *)realloc(s1,ml1);}
*s1=c;
s1++;
}
*s2='\0';
printf("Vvedite s2: ");
s2=(char *)malloc(ml2);
while ((c=getchar())!=10){
l2++;
if (l2=ml2-1) {ml2+=10;s2=(char *)realloc(s2,ml1);}
*s2=c;
s2++;
}
*s2='\0';
s1-=l1;
s2-=l2;
for (int i=0;i<=l1;i++) {printf("%c",*s1);s1++;}
printf("\n");
for (int i=0;i<=l2;i++) {printf("%c",*s2);s2++;}
printf("\n");
s1-=l1;
s2-=l2;
s=(char *)malloc(l1+l2+3);
while (*s1) {*s=*s1;s++;s1++;}
while (*s2) {*s=*s2;s++;s2++;}
*s='\0';
s-=l1+l2;
for (int i=0;i<=l1+l2+1;i++) {printf("%c",*s);s++;}
printf("\n");
free(s1);
free(s2);
free(s);
return 0;
}

В консоли ошибка:
Vvedite s1: 4
Segmentation fault (core dumped)

Подскажите пожалуйста, что я делаю не так?
Ubuntu 10.04

Оффлайн Wuffur

  • Новичок
  • *
  • Сообщений: 32
    • Просмотр профиля
Re: Строки и указатели.
« Ответ #1 : 23 Сентябрь 2007, 13:16:18 »
ты что-то с памятью накосячил  :coolsmiley:
   #include<stdio.h>

   #include<stdlib.h>

   int main()

     {  int j=0,i=0,k=0,m=0;

char *s1=NULL,*s2=NULL,*s=NULL,*proverka,c;

printf("\n Vvod stroki adin\n");

do{

     scanf("%c",&c);

     proverka=(char*)realloc(s1,(i+1)*sizeof(char));

     if(proverka == NULL) {printf("\n Out of memory \n");exit(0); }

     s1 = proverka;

     s1[i]=c;

      i++;

    }while( s1[i-1] != 10);

    s1[i] = '\0';

printf("\n Vvod stroki dva\n");

do{

     scanf("%c",&c);

     proverka=(char*)realloc(s2,(j+1)*sizeof(char));

     if(proverka == NULL) {printf("\n Out of memory \n");exit(0); }

     s2 = proverka;

     s2[j]=c;

      j++;

    }while( s2[j-1] != 10);

    s2[j] = '\0';

        s=(char *)malloc(sizeof(s1)+sizeof(s2)-sizeof(char));
for(k=0; k<i-1;k++){s[k]=*(s1+k) ;};
for(m=0; m<j-1;m++){s[k+m]=*(s2+m);};
        s[k+m]='\0';
   printf("\n V resultate: \n"); printf("%s\т",s);
free(s1);free(s2);free(s);
return 0;

     }
« Последнее редактирование: 23 Сентябрь 2007, 13:17:50 от Wuffur »
Kernel panic - not syncing: Attempted to kill init!

Оффлайн ov7a

  • Автор темы
  • Любитель
  • *
  • Сообщений: 52
    • Просмотр профиля
Re: Строки и указатели.
« Ответ #2 : 23 Сентябрь 2007, 13:53:18 »
Тоже не все хорошо, тем более, забыл сказать, запись символов должна производится через указатели.
ov7a@ov7a:~/C$ ./a.out

 Vvod stroki adin
kljkjhlkjhlkhlk

 Vvod stroki dva
jnlkjlknlknlknlknlknlknlknlknlknlknhv87t879iuh97 bvjvkmhb

 V resultate:
kljkjhlkjhlkhlkjnlkjlknlknlknlknlknlknlknlknlknlknhv87t879iuh97 bvjvkmhb
*** glibc detected *** ./a.out: free(): invalid next size (fast): 0x0804a060 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xb7dc07cd]
/lib/tls/i686/cmov/libc.so.6(cfree+0x90)[0xb7dc3e30]
./a.out(__gxx_personality_v0+0x2ca)[0x804875e]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xdc)[0xb7d6eebc]
./a.out(__gxx_personality_v0+0x4d)[0x80484e1]
======= Memory map: ========
08048000-08049000 r-xp 00000000 03:03 425875     /home/ov7a/C/a.out
08049000-0804a000 rw-p 00000000 03:03 425875     /home/ov7a/C/a.out
0804a000-0806b000 rw-p 0804a000 00:00 0          [heap]
b7c00000-b7c21000 rw-p b7c00000 00:00 0
b7c21000-b7d00000 ---p b7c21000 00:00 0
b7d58000-b7d59000 rw-p b7d58000 00:00 0
b7d59000-b7e94000 r-xp 00000000 03:03 573475     /lib/tls/i686/cmov/libc-2.5.so
b7e94000-b7e95000 r--p 0013b000 03:03 573475     /lib/tls/i686/cmov/libc-2.5.so
b7e95000-b7e97000 rw-p 0013c000 03:03 573475     /lib/tls/i686/cmov/libc-2.5.so
b7e97000-b7e9a000 rw-p b7e97000 00:00 0
b7e9a000-b7ea5000 r-xp 00000000 03:03 539680     /lib/libgcc_s.so.1
b7ea5000-b7ea6000 rw-p 0000a000 03:03 539680     /lib/libgcc_s.so.1
b7ea6000-b7ea7000 rw-p b7ea6000 00:00 0
b7ea7000-b7ecc000 r-xp 00000000 03:03 573483     /lib/tls/i686/cmov/libm-2.5.so
b7ecc000-b7ece000 rw-p 00024000 03:03 573483     /lib/tls/i686/cmov/libm-2.5.so
b7ece000-b7fad000 r-xp 00000000 03:03 34669      /usr/lib/libstdc++.so.6.0.8
b7fad000-b7fb0000 r--p 000de000 03:03 34669      /usr/lib/libstdc++.so.6.0.8
b7fb0000-b7fb2000 rw-p 000e1000 03:03 34669      /usr/lib/libstdc++.so.6.0.8
b7fb2000-b7fb8000 rw-p b7fb2000 00:00 0
b7fc8000-b7fcc000 rw-p b7fc8000 00:00 0
b7fcc000-b7fe5000 r-xp 00000000 03:03 539637     /lib/ld-2.5.so
b7fe5000-b7fe7000 rw-p 00019000 03:03 539637     /lib/ld-2.5.so
bfbac000-bfbc2000 rw-p bfbac000 00:00 0          [stack]
ffffe000-fffff000 r-xp 00000000 00:00 0          [vdso]
Aborted (core dumped)
« Последнее редактирование: 23 Сентябрь 2007, 14:06:37 от ov7a »
Ubuntu 10.04

Оффлайн Wuffur

  • Новичок
  • *
  • Сообщений: 32
    • Просмотр профиля
Re: Строки и указатели.
« Ответ #3 : 23 Сентябрь 2007, 14:36:45 »
Вот посмотри вроде всё работает, насчёт выделения памяти через указатели не понял. Можно указать в примере?


[вложение удалено Администратором]
Kernel panic - not syncing: Attempted to kill init!

Оффлайн ov7a

  • Автор темы
  • Любитель
  • *
  • Сообщений: 52
    • Просмотр профиля
Re: Строки и указатели.
« Ответ #4 : 23 Сентябрь 2007, 15:02:23 »
Все, решил. Спасибо.
#include <stdio.h>
#include <stdlib.h>
int main(){
int l1=0,l2=0,i=0,j=0;
char c,*s1=NULL,*s2=NULL,*s;
printf("Vvedite s1: ");
while ((c=getchar())!=10){
s1=(char *)realloc(s1,(l1+1)*sizeof(char));
*(s1+l1++)=c;
}
*(s1+l1)='\0';
printf("Vvedite s2: ");
while ((c=getchar())!=10){
s2=(char *)realloc(s2,(l2+2)*sizeof(char));
*(s2+l2++)=c;
}
*(s2+l2)='\0';
s=(char *)malloc(l1+l2+1);
while (*(s1+i)) {*(s+i)=*(s1+i++);}
while (*(s2+j)) {*(s+i++)=*(s2+j++);}
*(s+i)='\0';
puts(s);
free(s1);
free(s2);
free(s);
return 0;
}
Ubuntu 10.04

 

Страница сгенерирована за 0.058 секунд. Запросов: 24.