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
Merci à tous !!! – diana
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