Jak przerobic kod z C++ na C

0

Mam taki kod

 
#include <iostream> 
#include <fstream> 

using namespace std; 

const int buffSize = 1024; 

int main() 
{ 
    char buff[buffSize]; 
    char **explode, explodeChar = ' '; 
    int count = 0, explodeIndex = 0, tmpIndex = 0; 
    fstream file("dane.txt", ios::in); 
    
    file.getline(buff, buffSize); 
    for (int i = 0; i < strlen(buff); i++) 
        if (buff[i] == explodeChar) count++; // zliczamy ilość separatorów 
        
    explode = new char*[count + 1]; // dynamiczna alokacja potrzebnej pamięci 
    for (int i = 0; i < count + 1; i++) 
        explode[i] = new char[buffSize]; 

    for (int i = 0; i < strlen(buff); i++) // proces separowania 
    { 
        if (buff[i] != explodeChar) 
        { 
           explode[explodeIndex][tmpIndex] = buff[i]; 
           tmpIndex++; 
        } 
        else 
        { 
            explode[explodeIndex][tmpIndex] = '\0'; 
            explodeIndex++; 
            tmpIndex = 0; 
        } 
    } 

    for (int i = 0; i < count + 1; i++) // wypisujemy na ekran 
        cout << explode[i] << endl; 
    
    
    file.close(); 
    
    for (int i = 0; i < count + 1; i++) // sprzatamy po sobie 
        delete [] explode[i]; 
    delete [] explode; 
    
    getchar(); 
    return 0;    
} 

Chciałem powyzszy kod w C++ przerobić na C ale wysypuje sie błąd w linijce:
explode = (char) malloc (count+1);*

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

int main()
  {
   char **explode,explodeChar = ','; 
   int count = 0, explodeIndex = 0, tmpIndex = 0, i = 0;
   
   const char *string="a,abc,abcd,abcde,abcdef,abcdefg";
   const char a[50]="a,abc,abcd,abcde,abcdef,abcdefg";

   for (i = 0; i < strlen(a); i++) 
        if (a[i] == explodeChar) count++;

   explode = (char*) malloc (count+1);

    for (i = 0; i < strlen(a); i++) // proces separowania 
    { 
      if (a[i] != explodeChar) 
        { 
          explode[explodeIndex][tmpIndex] = a[i]; 
          tmpIndex++; 
        } 
        else 
        { 
           explode[explodeIndex][tmpIndex] = '\0'; 
           explodeIndex++; 
           tmpIndex = 0; 
        }   
    } 

   for (i = 0; i < count + 1; i++) // wypisujemy na ekran 
        printf("Dane: %s\n",explode[i]); 

   printf("Dane: %s \n",a);

   return 0;
  }

Info Error:

 
# gcc -o test test.c -lpq
test.c: In function 'main':
test.c:15: warning: incompatible implicit declaration of built-in function 'malloc'
test.c:15: warning: assignment from incompatible pointer type
0
#include <stdlib.h>
0

Zrobiłem taki kod jak poniżej kiedy kompiluje to nie wyskakuje błąd.
Ale kiedy uruchamiam to mam: Naruszenie ochrony pamięci.
Co tu może być źle jeszcze ?

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

int main()
  {
   char **explode,explodeChar = ','; 
   int count = 0, explodeIndex = 0, tmpIndex = 0, i = 0;
   
   const char *string="a,ab,aaas,awefewf,fewfgwe,gewg,weg,we,g,egwg";
   const char a[50]="a,ab,aaas,awefewf,fewfgwe,gewg,weg,we,g,egwg";

   for (i = 0; i < strlen(a); i++) 
        if (a[i] == explodeChar) count++;

  
  explode = (char**) malloc (count * sizeof(char*));
 

    for (i = 0; i < strlen(a); i++) // proces separowania 
    { 
      if (a[i] != explodeChar) 
        { 
          explode[explodeIndex][tmpIndex] = a[i]; 
          tmpIndex++; 
        } 
        else 
        { 
           explode[explodeIndex][tmpIndex] = '\0'; 
           explodeIndex++; 
           tmpIndex = 0; 
        }   
    } 

   for (i = 0; i < count + 1; i++) // wypisujemy na ekran 
        printf("Dane: %s\n",explode[i]); 

   printf("Dane: %s \n",a);

   free(explode);

   return 0;
  }
0

Zapomniałeś o pętli alokującej miejsca na łańcuchy znaków.

0

Pierwsza petla liczy ile bedzie czesci z danego lancucha i count to jest liczba przecinkow + 1 no bo jeden wyraz wiecej.
Ale ponieważ mam ile zajmuje cały string to pomnożyć go przez sizeof (char) ?
strlen(a) * sizeof(char)

edit: jak to zrobilem to tez nadal błąd naruszenia pamięci heh

0

Poprawnie przydzieliłeś pamięć dla tablicy wskaźników ale każdy z tych wskaźników powinien wskazywać na przydzielony obszar aby móc je używać jako tablice.
Zrób kopie tablicy a[] np za pomocą strdup.
W tablice wskaźników explode wpisuj adresy początków słów w kopii.
W kopii zastąp przecinek na znak '\0'

1 użytkowników online, w tym zalogowanych: 0, gości: 1