2014-09-03 8 views
5

ComponentiCome assegnare gli array 2-d l'uno all'altro?

ho una stringa, ad esempio

char block[4][256] = "";

e ho frase

char sentence[256] = "Bob walked his dog";

Ho anche un iteratore variabile

int pos = 0;

Quello che sto cercando di realizzare

sto cercando di assegnare ogni parola nella matrice sentence nel 2-d matrice blocco block in sequenza.

Per esempio,

Diciamo che ho questo codice (il mio write-up - non ha funzionato come avevo programmato)

for (int x=0; x < ((int)strlen(sentence)); x++) 
{ 
    if (sentence[x] == ' ') // not using strcmp at the moment to be more clear 
    { 
     ++pos; // move to the next word after space 
     for (int y=0; y < pos; y++) // scan through the word 
     { 
      for (int z=0; z < x; z++) // add the word to the array 
      { 
       block[y][z] = sentence[z]; // assign the block (!!confusion here!!) 
      } 
     } 
    } 
} 

Come la vedo io

Per come la vedo avvicinandomi a questo problema, devo prima scansionare la frase fino a quando non trovo uno spazio ", un carattere. Dopo averlo incontrato devo ripetere la scansione della frase e iniziare ad aggiungere tutti i caratteri fino alla posizione di quello spazio vuoto "" nel primo segmento del mio blocco array block[y][z], z essendo l'iteratore nell'istruzione for precedente, e y la posizione + 1 per ogni spazio incontrato. Credo che il mio problema principale qui è capire come assegnare gli array 2-d. Se qualcuno vede un approccio migliore a questo problema mi piacerebbe sentirlo, grazie!

L'uscita Voglio

Dopo aver stampato il contenuto del block[x][256] Voglio che ogni x per l'output ogni parola nella matrice che sto scansione per esempio. Se ho qualcosa di simile.

for (int a=0; a < 4; a++) 
{ 
    for (int b=0; b < strlen(block[a][]); b++) 
    { 
     printf("%s\n", block[a][b]); 
    } 
} 

Voglio l'output di essere:

block[0][]: Bob 
block[1][]: walked 
block[2][]: his 
block[3][]: dog 

Chiunque può aiutare a come posso affrontare questo problema? Grazie!

+0

Ciò che è cmd qui ?? – Adarsh

+0

A tale proposito - mi dispiace, ho rimosso quel pezzo di codice come era in considerazione di una parte precedente del mio progetto. – user3251225

+0

Se è C++, perché non stai usando 'std :: string',' std :: vector ', così come' cout', ecc.? Inoltre, 'std :: istringstream' potrebbe essere usato per separare l'input in parole. In altre parole, il tuo problema potrebbe essere ridotto a poche righe di codice 'C++'. – PaulMcKenzie

risposta

4

Penso che questo è quello che stavi per.

int word_start = 0, word_end = 0, current_word = 0; 

for (int x = 0; x < strlen(sentence) + 1; x++) 
{ 
    if (sentence[x] == ' ' || sentence[x] == '\0') 
    { 
     word_end = x; 
     int y, z; 
     for (y = 0, z = word_start; z < word_end; y++, z++) 
     { 
      block[current_word][y] = sentence[z]; 
     } 
     word_start = x + 1; 
     current_word++; 
    } 
} 

Ecco il programma che ho usato per provarlo, se non funziona per voi e vi piacerebbe vedere come ho interpretato la tua domanda.

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

int main (const int argc, char * const argv[]) 
{ 
    char block[4][256] = {0}; 
    char sentence[256] = "Bob walked his dog"; 

    int word_start = 0, word_end = 0, current_word = 0; 

    for (int x = 0; x < strlen(sentence) + 1; x++) 
    { 
     if (sentence[x] == ' ' || sentence[x] == '\0') 
     { 
      word_end = x; 
      int y, z; 
      for (y = 0, z = word_start; z < word_end; y++, z++) 
      { 
       block[current_word][y] = sentence[z]; 
      } 
      word_start = x + 1; 
      current_word++; 
     } 
    } 

    for (int x = 0; x < 4; x++) 
    { 
     printf("%s\n", block[x]); 
    } 
} 
+1

Perché non usare semplicemente 'memcpy' invece del ciclo? – PaulMcKenzie

+4

Direi che "memcpy" è un'ottimizzazione che l'OP può utilizzare quando comprende i principi coinvolti. –

+0

Mostrerei la soluzione corretta con l'allocazione dinamica del buffer di output e 'strlcpy', ma questo è più pertinente e nello stile della domanda. – OregonTrail

4

Durante la memorizzazione nel blocco,

for (int i=0 ; i < 4 ; i++) 
{ 
    for (int j=0 ; j < 256 ; j++) 
    { 
     if (sentence[j] == ' ') 
     { 
      block[i][j] = '\0'; 
      break; 
     } 
     block[i][j]=sentence[j]; 
    } 
} 

Durante la stampa,

for (int i=0 ; i<4 ; i++) 
{ 
    printf ("block[%d][]: %s\n", i, block[i]); 
} 
+0

Grazie per la risposta. Apprezzo il tempo che hai dedicato alla stesura di questo, anche se cercavo una risposta più universale come gli Oregons. Che con le modifiche non mi limiterà una frase di 4 parole. +1 per i tuoi sforzi. Grazie! – user3251225

0

seguente blocco funziona .. è necessario prendersi cura di spazi multipli se ci sono nella frase.

unsigned int x = 0; 
size_t length = strlen(sentence); 
unsigned int word=0 ; 
while (x < length) 
{ 
     // copy this word to block 
     unsigned charactercount = 0; 
     char character = sentence[x++] ; 
     while (x<=length && ' ' != character) 
     { 
      block[word][charactercount++] = character; 
      character = sentence[x++] ; 
     } 
     if (' ' == character || 0 == character) 
     { 
      block[word][charactercount++] = 0; 
      word++; 
     } 
} 
3

In primo luogo, proprio come una nota - il problema sarà molto maggiore se mai bisogno di memorizzare qualsiasi cosa sopra 4 parole, e soprattutto se si sta scrivendo le cose in C invece di utilizzare C++ e vari contenitori che sono disponibili in C++.

Dal momento che le risposte (finora) ha soluzioni 'C', ecco una soluzione di C++ utilizzando std::istringstream e std::string:

#include <sstream> 
#include <string> 
#include <cstdlib> 

int main() 
{ 
    char block[4][256] = { 0 }; 
    char sentence[] = "Bob walked his dog"; 

    std::istringstream sstrm(sentence); 
    int curWord = 0; 
    std::string s; 
    while (sstrm >> s) 
    { 
     memcpy(&block[curWord][0], s.c_str(), s.size()); 
     ++curWord; 
    } 
} 
+0

Altro come C++ sarebbe sostituire 'memcpy' con' std :: copy (s.begin(), s.end(), & block [curWord] [0]); ' –

+0

Naturalmente, se questo è usato in "codice reale", allora dovresti controllare che 'curWord <4', e che' s.size() <256' o equivalente –

+0

Sebbene stavo cercando una soluzione più orientata verso "C", apprezzo l'eccezionale prospettiva C++ su esso. Sono sicuro che potrebbe aiutare qualcuno in cerca di una risposta simile a questa in futuro. Grazie! +1 – user3251225