2009-11-04 4 views
1

Comment vérifier un tableau de caractères est nul dans l'objectif C?Comment vérifier un tableau de caractères est nul dans l'objectif C

char hName[255]; 
- (void)setHost { 
    phent = gethostbyaddr((const char*)&haddr, sizeof(int), AF_INET); 
    if(phent){ 
    strncpy(hName,phent->h_name,255);          

} 

-(void) getHost { 
    NSString *str = [[NSString alloc] initWithBytes:tTemp.hName 
    length:sizeof(tTemp.hName) encoding:NSASCIIStringEncoding]; 
} 

J'ai un tableau de caractères nommé hName [255]. J'attribuerai des valeurs à ce tableau à un moment donné de mon projet. Maintenant, j'ai besoin de vérifier si le hName [255] contient une valeur nulle. J'ai essayé quelques méthodes. Je reçois une chaîne str de ce tableau et vérifie si elle est égale à @ ""; Ça a échoué. Ensuite, je vérifie la longueur de la chaîne str. Même si le tableau ne contient aucune valeur, il renvoie 255. Comment puis-je vérifier que le tableau contient une valeur nulle? De l'aide? Merci d'avance!!

+0

Merci à tous !!! – diana

+0

Le texte en retrait avec 4 espaces est analysé comme du code. Mettre en retrait le texte 4 espaces si et seulement si c'est du code. – outis

Répondre

9

Vous pourriez avoir besoin d'élaborer un peu sur votre question. Par exemple, pour simplement vérifier si un pointeur est nul est assez simple:

char *my_chars; 

... 

if (! my_chars) 
    NSLog(@"Woo, my_chars is null"); 
else 
    NSLog(@"my_chars is at 0x%08x", my_chars); 

parce que nul est juste 0 :)


Cependant, il ne ressemble pas à c'est votre problème. vous avez créé un tableau de caractères comme

char my_chars[255]; 

ainsi my_chars ne sera pas nul.

Cependant, comme outis dit dans his answer, vous venez de l'allouer et de ne pas mettre à zéro le contenu de sorte que vous n'avez aucune idée de ce qu'il y a dans ces 255 octets! il suggère je personnellement des trois options aller avec celui-ci:

char my_chars[255]; 
memset(my_chars, 0, sizeof(my_chars)); 

maintenant, vous avez un tableau de 255 zéros :) Ceci est assez facile de vérifier si elle est nulle:

if (0 == strlen(my_chars)) 
    NSLog(@"It's not null but it is an empty string!"); 
else 
    NSLog(@"my_chars contains a valid string which is %i chars long", strlen(my_chars)); 

Espérons que cela aide.

Sam

+0

J'ai édité ma question .Kindly passer par là. – diana

0

La première chose, notez que le mot "null" est surchargée. Vous pouvez avoir des pointeurs NULL et des chaînes NULL (vides), et il y a le caractère nul ('\ 0', égal à 0 lorsqu'il est converti en un entier: ((int)'\0') == 0). Il existe également des variables non initialisées, qui peuvent être ou ne pas être nulles. Je suppose que vous parlez d'un tableau de caractères non initialisé, utilisé comme un c-string.

Le plus probable, hName est alloué sur la pile (je ne peux pas dire sans voir plus du code source), ce qui signifie que c'est not zero-initialized. En pratique, hName tiendra toutes les données qui ont été stockées pour la dernière fois dans la zone de mémoire occupée par hName. Vous devrez l'initialiser vous-même.

char hName[255] = {0}; 
// or 
memset(hName, 0, sizeof(hName)); 
// or, if you have bzero 
bzero(hName, sizeof(hName)); 

Notez également que depuis hName est déclaré comme un tableau plutôt qu'un pointeur, sizeof(hName) est le nombre de caractères qu'il stocke.

void test() { 
    char *name1 = ""; 
    char name2[255]; 
    // All the following lines will be true 
    strlen(name1) == 0; 
    sizeof(name2) == 255 
    0 <= strlen(name2) && strlen(name2) < 255; 
    // pointers are 4 or 8 bytes on most machines these days 
    sizeof(name1) == 4 || sizeof(name1) == 8; 
} 

Modifier (exemple de code d'adressage):

La longueur de str dans getHost est de 255 parce que vous le dire d'avoir cette longueur lors de la copie de tTemp.hName. NSStrings peut contenir des valeurs nulles, bien que vous ayez des difficultés à les imprimer ainsi que les caractères suivants.

Il n'est pas clair à partir de l'exemple de code si hName est un global (globals are bad) ou une propriété. De même, la portée des autres variables, telles que haddr et tTemp, n'est pas claire. Certains d'entre eux devraient être des paramètres pour les méthodes. Le nom "setHost" doit être réservé à un setter-one d'une paire de méthodes ("accesseurs", en langage Objective-C) qui obtiennent et définissent une propriété. Ils retournent et prennent (respectivement) un type qui est théoriquement le type de la propriété. Dans ce cas, NSString* est le plus logique; mieux utiliser un NSString dans votre code et passer à (via NSString cStringUsingEncoding: ou UTF8String). Le partenaire de -(void)setHost:(NSString*) serait -(NSString*)host. Une fois que vous passez à NSString (et utilisez stringFromCString:withEncoding:), vous pouvez simplement examiner sa longueur ou le comparer à @"" pour vérifier une chaîne vide.

@interface MyHost : NSObject { 
    NSString *name_; 
    ... 
} 
/* post ObjC 2.0 */ 
@property(retain) NSString* name; 
/* pre ObjC 2.0 */ 
-(NSString*)name; 
-(void)setName:(NSString*); 

/* any ObjC version */ 
-(int)setHostFromAddress:(MyAddress*)addr; 
... 
@end 

@implementation MyHost 
/* post ObjC 2.0 */ 
@synthesize name = name_; 
-(int)setHostFromAddress:(MyAddress*)addr { 
    struct hostent *phost; 
    phost = gethostbyaddr(addr.address, addr.length, addr.type); 
    if (phost) { 
     self.name = [NSString stringWithCString:phost->h_hname encoding:NSASCIIStringEncoding]; 
    } 
    return h_errno; 
} 

/* pre ObjC 2.0 */ 
-(NSString*)name { 
    return name_; 
} 
-(NSString*)setName:(NSString*)nom { 
    [name_ release]; 
    name_ = [nom retain]; 
} 
-(int)setHostFromAddress:(MyAddress*)addr { 
    struct hostent *phost; 
    phost = gethostbyaddr([addr address], [addr length], [addr type]); 
    if (phost) { 
     [self setName:[NSString stringWithCString:phost->h_hname encoding:NSASCIIStringEncoding]]; 
    } 
    return h_errno; 
} 
... 
@end 
+0

J'ai édité ma question. Je pense que maintenant c'est plus clair et vous pouvez comprendre facilement. – diana

Questions connexes