web-dev-qa-db-fra.com

Comment vérifier si la chaîne C est vide

J'écris un très petit programme en C qui doit vérifier si une chaîne est vide. Par souci de cette question, j'ai simplifié mon code:

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

int main() {
  char url[63] = {'\0'};
  do {
    printf("Enter a URL: ");
    scanf("%s", url);
    printf("%s", url);
  } while (/*what should I put in here?*/);

  return(0);
}

Je veux que le programme cesse de boucler si l'utilisateur appuie simplement sur Entrée sans rien entrer.

44
codedude

Comme les chaînes de style C se terminent toujours par le caractère nul (\0), vous pouvez vérifier si la chaîne est vide en écrivant

do {
   ...
} while (url[0] != '\0');

Vous pouvez également utiliser la fonction strcmp, qui est excessive, mais peut-être plus facile à lire:

do {
   ...
} while (strcmp(url, ""));

Notez que strcmp renvoie une valeur différente de zéro si les chaînes sont différentes et de 0 si elles sont identiques. Cette boucle continue ainsi jusqu'à ce que la chaîne soit non vide.

J'espère que cela t'aides!

53
templatetypedef

Si vous voulez vérifier si une chaîne est vide:

if (str[0] == '\0')
{
    // your code here
}
14
nabroyan

Si le premier caractère se trouve être '\0', alors vous avez une chaîne vide.

Voici ce que vous devriez faire:

do {
    /* 
    *   Resetting first character before getting input.
    */
    url[0] = '\0';

    // code
} while (url[0] != '\0');
7

Généralement, vous aurez du mal à obtenir une chaîne vide ici, en considérant que %s Ignore les espaces (espaces, tabulations, nouvelles lignes) ... mais peu importe, scanf() renvoie le nombre de correspondances réussies ...

De la page de manuel:

le nombre d'éléments d'entrée mis en correspondance et attribués avec succès, qui peut être inférieur à celui prévu, voire même égal à zéro en cas d'échec de la mise en correspondance précoce.

donc si, d'une manière ou d'une autre, ils ont réussi à se débrouiller avec une chaîne vide (ctrl+z par exemple), vous pouvez simplement vérifier le résultat.

int count = 0;
do {
  ...
  count = scanf("%62s", url);  // You should check return values and limit the 
                               // input length
  ...
} while (count <= 0)

Notez que vous devez vérifier moins car, dans l'exemple que j'ai donné, vous obtiendrez -1, De nouveau détaillé dans la page de manuel:

La valeur EOF est renvoyée si la fin de la saisie est atteinte avant la première conversion réussie ou un échec de correspondance. EOF est également renvoyé en cas d'erreur de lecture. se produit, auquel cas l'indicateur d'erreur pour le flux (voir ferror (3)) est défini et errno contient le code d'erreur.

4
Mike

Vous pouvez vérifier la valeur de retour de scanf. Ce code restera simplement là jusqu'à ce qu'il reçoive une chaîne.

int a;

do {
  // other code
  a = scanf("%s", url);

} while (a <= 0);
3
squiguy

Vous pouvez essayer comme ça: -

if (string[0] == '\0') {
}

Dans votre cas, cela peut être comme: -

do {
   ...
} while (url[0] != '\0')

;

2
Rahul Tripathi

strlen(url)

Retourne la longueur de la chaîne. Il compte tous les caractères jusqu'à ce qu'un octet nul soit trouvé. Dans votre cas, vérifiez-le contre 0.

Ou simplement le vérifier manuellement avec:

*url == '\0'
2
flyingOwl

Remplacez d'abord la scanf() par fgets() ...

do {
    if (!fgets(url, sizeof url, stdin)) /* error */;
    /* ... */
} while (*url != '\n');
2
pmg

Le plus court chemin à faire serait:

do {
    // Something
} while (*url);

Fondamentalement, *url retournera le caractère à la première position du tableau; puisque les chaînes C sont terminées par un caractère NULL, si la chaîne est vide, sa première position sera le caractère '\0', dont la valeur ASCII est 0; Puisque les instructions logiques C traitent chaque valeur zéro comme false, cette boucle continuera à fonctionner tant que la première position de la chaîne n'est pas nulle, c'est-à-dire tant que la chaîne n'est pas vide.

Lectures recommandées si vous voulez mieux comprendre ceci:

1
Haroldo_OK