2009-11-08 14 views
2

je continue à avoir cette erreur: initialiseur-chaîne pour tableau de caractères est trop long Même si je change num et la longueur 1, il obtient toujours l'erreur:initialiseur-chaîne pour tableau de caractères est trop long

#include <iostream> 
#include <cstring> 
using namespace std; 

int main() 
{ 
    const int num = 11; 
    const int length = 25; 
    char array[num][length] = { "Becky Warre, 555-1223" 
           "Joe Looney, 555-0097" 
           "Geri Palmer, 555-8787" 
           "Lynn Presnell, 555-1212" 
           "Holly Gaddis, 555-8878" 
           "Sam Wiggins, 555-0998" 
           "Bob Kain, 555-8712" 
           "Tim Haynes, 555-7676" 
           "Warren Gaddis, 555-9037" 
           "Jean James, 555-4939" 
           "Ron Palmer, 555-2893" }; 

    char search[length]; 
    cout << "Enter a string to search: "; 
    cin.getline(search, length); 

    char *ptr = NULL; 
    int i; 
    for (i = 0; i < num; i++) 
    { 
     ptr = strstr(array[num], search); 
     if (ptr != NULL) 
      cout << array[i]; 
    } 
    if (ptr == NULL) 
     cout << "No match found" << endl; 

    return 0; 
} 

Répondre

10

Je pense qu'il est parce qu'il n'y a pas de virgules dans votre initialisation de tableau ...

char array[num][length] = { "Becky Warre, 555-1223", 
          "Joe Looney, 555-0097", 
          "Geri Palmer, 555-8787", 
          "Lynn Presnell, 555-1212", 
          "Holly Gaddis, 555-8878", 
          "Sam Wiggins, 555-0998", 
          "Bob Kain, 555-8712", 
          "Tim Haynes, 555-7676", 
          "Warren Gaddis, 555-9037", 
          "Jean James, 555-4939", 
          "Ron Palmer, 555-2893" } 
+0

wow merci, je ne peux pas croire que j'ai raté ça – Raptrex

+0

@Raptrex Il arrive, je suis sûr que nous avons tous été là. –

+2

La concaténation littérale de chaîne adjacente est très pratique - lorsque vous avez l'intention de l'utiliser. Quand vous ne le faites pas, cela peut conduire à des problèmes mystérieux. –

2

Vous entrez une grande chaîne dans votre tableau. Vous devez séparer les chaînes avec des virgules.

+0

Et assurez-vous que votre plus longue chaîne ne dépasse pas 24 caractères, car un caractère de plus est nécessaire pour terminer 0. – Arkadiy

4

Semble vous avez oublié d'ajouter une virgule de. L'initialisation d'un tableau char* se fait comme ceci:

char entries [number_of_items][lenght] = { "entry1", "entry2", .... }; 

En dehors de cela, vous pouvez vous épargner beaucoup d'ennuis en utilisant un tableau de std::string s:

std::string entries[] = { "entry1", "entry2", ... }; 
+3

+1 pour std :: string .. pas de vecteur? –

+0

Bonne idée! Je sauve le «vecteur» pour la prochaine fois :) – xtofl

1

Outre les virgules manquantes dans votre ensemble d'initialisateurs, pourquoi ne pas simplement en faire un tableau à 2 dimensions de char? Vous ne faites que passer les données du tableau à strstr(), et tout ce qu'il veut, ce sont des chaînes terminées par un caractère nul. Pourquoi ne pas utiliser plus souple:

char* array[] = { 
    "Becky Warre, 555-1223", 
    "Joe Looney, 555-0097", 
    "Geri Palmer, 555-8787", 
    "Lynn Presnell, 555-1212", 
    "Holly Gaddis, 555-8878", 
    "Sam Wiggins, 555-0998", 
    "Bob Kain, 555-8712", 
    "Tim Haynes, 555-7676", 
    "Warren Gaddis, 555-9037", 
    "Jean James, 555-4939", 
    "Ron Palmer, 555-2893", 
    NULL 
}; 

Maintenant que le tableau est juste un ensemble de pointeurs (et il termine par un pointeur NULL), la boucle peut ressembler à:

char *ptr = NULL; 
int i; 
for (i = 0; array[i] != NULL; i++) 
{ 
     ptr = strstr(array[i], search); 
     if (ptr != NULL) 
       cout << array[i]; 
} 

Un avantage de cela, vous pouvez ajouter de nouvelles chaînes aux données sans avoir à mettre à jour les numéros de «taille» correspondants. Et vous n'aurez jamais à vous inquiéter du fait que le compilateur se plaint que le tableau est trop petit dans une dimension ou dans une autre - cela ne fera que rendre le tableau de la taille dont il a besoin.

+0

'sizeof (array)/sizeof (array [0])'. – ulidtko

Questions connexes