69

特定の文字列が空かどうかを確認する必要がある非常に小さなプログラムを C で作成しています。この質問のために、コードを簡略化しました。

#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);
}

ユーザーが何も入力せずにEnterキーを押すだけで、プログラムのループを停止したい。

4

13 に答える 13

79

Cスタイルの文字列は常にヌル文字(\0)で終了するため、次のように記述することで文字列が空かどうかを確認できます。

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

または、この関数を使用することもできますstrcmp。これはやり過ぎですが、読みやすい場合があります。

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

strcmp文字列が異なる場合はゼロ以外の値を返し、同じ場合は0を返すため、このループは文字列が空でなくなるまでループし続けることに注意してください。

お役に立てれば!

于 2013-03-18T19:27:45.433 に答える
22

文字列が空かどうかを確認したい場合:

if (str[0] == '\0')
{
    // your code here
}
于 2013-03-18T19:26:26.670 に答える
7

最初の文字が の場合'\0'は、空の文字列になります。

これはあなたがすべきことです:

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

    // code
} while (url[0] != '\0');
于 2013-03-18T19:26:58.273 に答える
4

%s通常、空白(スペース、タブ、改行)を無視することを考えると、ここで空の文字列を取得するのは難しいでしょう...しかし、それにもかかわらず、scanf()実際には成功した一致の数を返します...

マニュアルページから:

正常に一致および割り当てられた入力アイテムの数。これは、提供された数よりも少ない場合があり、早期の一致が失敗した場合はゼロになることもあります。

したがって、どういうわけか彼らが空の文字列でうまくいくことができた場合(ctrl+zたとえば)、あなたはただ返される結果をチェックすることができます。

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

私が示した例では、戻ってくるので、チェックする必要が少ないことに注意してください。これも-1manページで詳しく説明されています。

値EOFは、最初の変換の成功またはマッチングの失敗が発生する前に入力の終わりに達した場合に返されます。読み取りエラーが発生した場合もEOFが返されます。この場合、ストリームのエラーインジケータ(ferror(3)を参照)が設定され、errnoが設定されているとエラーが示されます。

于 2013-03-18T19:31:44.447 に答える
3

からの戻り値を確認できますscanf。このコードは、文字列を受け取るまでそこに留まります。

int a;

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

} while (a <= 0);
于 2013-03-18T19:30:16.580 に答える
3

strlen(url)

文字列の長さを返します。null バイトが見つかるまで、すべての文字をカウントします。あなたの場合、0に対してチェックしてください。

または、次の方法で手動で確認してください。

*url == '\0'
于 2013-03-18T19:26:54.680 に答える
2

まずscanf()fgets()...に置き換えます。

do {
    if (!fgets(url, sizeof url, stdin)) /* error */;
    /* ... */
} while (*url != '\n');
于 2013-03-18T19:33:43.087 に答える
2

次のように試すことができます:-

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

あなたの場合、次のようになります:-

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

;

于 2013-03-18T19:26:10.920 に答える
2

それを行う最短の方法は次のとおりです。

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

基本的に*url、配列の最初の位置にある char を返します。C 文字列は null で終了するため、文字列が空の場合、最初の位置は文字'\0'で、その ASCII 値は0; です。C 論理ステートメントはすべてのゼロ値を として扱うためfalse、文字列の最初の位置が null でない間、つまり文字列が空でない間、このループは続行されます。

これをよりよく理解したい場合は、以下をお勧めします。

于 2018-05-05T10:43:41.523 に答える
-1

strtok() を使用すると、"if (strtok(s," \t")==NULL)" という 1 行で実行できます。例えば:

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

int is_whitespace(char *s) {
    if (strtok(s," \t")==NULL) {
        return 1;
    } else {
        return 0;
    }
}

void demo(void) {
    char s1[128];
    char s2[128];
    strcpy(s1,"   abc  \t ");
    strcpy(s2,"    \t   ");
    printf("s1 = \"%s\"\n", s1);
    printf("s2 = \"%s\"\n", s2);
    printf("is_whitespace(s1)=%d\n",is_whitespace(s1));
    printf("is_whitespace(s2)=%d\n",is_whitespace(s2));
}

int main() {
    char url[63] = {'\0'};
    do {
        printf("Enter a URL: ");
        scanf("%s", url);
        printf("url='%s'\n", url);
    } while (is_whitespace(url));
    return 0;
}
于 2014-04-22T06:07:57.633 に答える