2010-11-10 6 views
10

Je veux initialiser la chaîne en C pour la chaîne vide. Je essayé:Initialiser une chaîne en C pour vider la chaîne

string[0] = ""; 

mais il écrit

"warning: assignment makes integer from pointer without a cast" 

Comment dois-je faire alors?

+1

À quoi sert de déclarer une chaîne de 0 caractères? – cdhowie

+0

Quel est le type de votre 'chaîne'? Est-ce un pointeur char ou un tableau char? – nos

+0

Qu'est-ce que 'string'? – leppie

Répondre

5

En supposant que votre tableau appelé 'string' existe déjà, essayez

string[0] = '\0'; 

\0 est la terminaison NUL explicite, nécessaire pour marquer la fin de la chaîne.

+22

Semnatically, cela devrait être 'string [0] = '\ 0';' ... –

+0

@badgerr: pourriez-vous changer votre réponse pour utiliser ''\ 0''? – pevik

20

Vous voulez définir le premier caractère de la chaîne à zéro, comme ceci:

char myString[10]; 
myString[0] = '\0'; 

(Ou myString[0] = 0;)

Ou, en fait, lors de l'initialisation, vous pouvez faire:

char myString[10] = ""; 

Mais ce n'est pas une manière générale de définir une chaîne à zéro une fois qu'elle a été définie.

+0

Effort minimum.:) –

+3

'char myString [1] =" ";' sûrement? Vous avez besoin d'espace pour le terminateur null. – JeremyP

+1

Correction: vous pourriez faire 'char myString [10] =" ";' – ruslik

3

Attribution littéraux de chaîne char tableau est autorisée uniquement pendant la déclaration:

char string[] = ""; 

Cette chaîne comme déclare tableau de caractères de taille 1 et initialise avec \0.

Essayez cela aussi:

char str1[] = ""; 
char str2[5] = ""; 
printf("%d, %d\n", sizeof(str1), sizeof(str2)); //prints 1, 5 
12

En plus de la version de Will Dean, les éléments suivants sont communs pour toute l'initialisation du tampon:

char s[10] = {'\0'}; 

ou

char s[10]; 
memset(s, '\0', sizeof(s)); 

ou

char s[10]; 
strncpy(s, "", sizeof(s)); 
1
string[0] = ""; 
"warning: assignment makes integer from pointer without a cast

Ok, nous allons plonger dans l'expression ...

0 un int: représente le nombre de caractères (en supposant que string est (ou pourris dans) un char *) pour faire avancer à partir du début de l'objet string

string[0]: l'objet char situé au début de la objet string

"": chaîne littérale: un objet de type char[1]

=: opérateur d'affectation: essais pour affecter une valeur de type char[1] à un objet de type char. char[1] (cariées à char*) et char ne sont pas compatibles cession, mais les fiducies de compilateur (le programmeur) et va de l'avant avec la cession de toute façon par coulée du type char* (ce char[1] à pourris) à un int --- et vous obtenez la avertissement en bonus. Vous avez un très bon compilateur :-)

+0

obtiendrait plus de upvotes s'il avait une solution; C'est une bonne explication de ce qui se passe. – wizzwizz4

+0

Je suis d'accord @ wizzwizz4, mais j'aime ma réponse telle qu'elle est. Merci! – pmg

2

calloc alloue la mémoire demandée et lui renvoie un pointeur. Il définit également la mémoire allouée à zéro.

Si vous prévoyez d'utiliser votre string en tant que chaîne vide tout le temps:

char *string = NULL; 
string = (char*)calloc(1, sizeof(char)); 

Si vous envisagez de stocker une valeur dans votre string plus tard:

char *string = NULL; 
int numberOfChars = 50; // you can use as many as you need 
string = (char*)calloc(numberOfChars + 1, sizeof(char)); 
0

Je pense Amarghosh a répondu correctement. Si vous voulez initialiser une chaîne vide (sans connaître la taille) la meilleure façon est:

//this will create an empty string without no memory allocation. 
char str[]="";// it is look like {0} 

Mais si vous voulez initialiser une chaîne avec une allocation de mémoire fixe que vous pouvez faire:

// this is better if you know your string size.  
char str[5]=""; // it is look like {0, 0, 0, 0, 0} 
0

Il est un peu en retard mais je pense que votre problème peut être que vous avez créé un tableau de longueur zéro, plutôt qu'un tableau de longueur 1.

Une chaîne est une série de caractères suivie d'une terminaison de chaîne ('\0'). Une chaîne vide ("") ne comporte aucun caractère suivi d'un seul caractère de terminaison de chaîne, c'est-à-dire un caractère au total.

donc je les opérations suivantes:

string[1] = ""

Notez que ce comportement n'est pas le émulé par strlen, qui ne compte pas la terminaison dans le cadre de la longueur de la chaîne.