web-dev-qa-db-ja.com

スペース文字で入力から文字列を読み取る?

私はUbuntuを使っています、そして私のIDEとしてGeanyとCodeBlockも使っています。私がやろうとしているのは("Barack Obama"のような)文字列を読み、それを変数に入れることです。

#include <stdio.h>

int main(void)
{
    char name[100];

    printf("Enter your name: ");
    scanf("%s", name);
    printf("Your Name is: %s", name);

    return 0;
}

出力:

Enter your name: Barack Obama
Your Name is: Barack

プログラムに名前全体を読み取らせるにはどうすればよいですか。

89
Hieu Nguyen

つかいます:

fgets (name, 100, stdin);

100はバッファの最大長です。必要に応じて調整してください。

つかいます:

scanf ("%[^\n]%*c", name);

[]はスキャンセット文字です。 [^\n]は、入力がではない改行('\n')が入力を受け取ることを指示します。それから%*cでそれは入力バッファから改行文字を読み込み(それは読み込まれません)、*はあなたがそれを必要としないので入力で読み込まれた読み込みが破棄される(代入抑制)ことを示します。あなたが取るかもしれない次の入力には問題を作成しないでください。

scanset割り当て抑制 演算子についてはこちらをお読みください。

getsを使うこともできますが....

決してgets()を使わないでください。 gets()が読み込む文字数を事前に知らずに判断することは不可能であり、gets()はバッファの終わりを超えて文字を格納し続けるため、使用するのは非常に危険です。コンピュータのセキュリティを破るために使用されてきました。代わりにfgets()を使用してください。

162
phoxis

これを試して:

scanf("%[^\n]s",name);

\nはスキャンした文字列の区切り文字を設定するだけです。

21
Sridhar Iyer

これは、fgets関数を使用して、スペースを含む入力を取得する方法の例です。

#include <stdio.h>

int main()
{
    char name[100];
    printf("Enter your name: ");
    fgets(name, 100, stdin); 
    printf("Your Name is: %s", name);
    return 0;
}
5
kyle k
scanf(" %[^\t\n]s",&str);

strは、文字列の取得元の変数です。

4
animesh

注:fgets()を使用する場合、CLI(コマンドラインインタプリタ)で小さな入力にfgets()を使用すると、文字列の末尾が 'Enter'になるので、配列の最後の文字が '\ n'になります。そのため、文字列を印刷すると、コンパイラは文字列を印刷するときに常に次の行に移動します。入力文字列にnullで終わる文字列のような動作をさせたい場合は、この単純なハックを使用してください。

#include<stdio.h>
int main()
{
 int i,size;
 char a[100];
 fgets(a,100,stdin);;
 size = strlen(a);
 a[size-1]='\0';

return 0;
}

更新:他のユーザーの助けを借りて更新しました。

2
Ritesh Sharma
#include <stdio.h>
// read a line into str, return length
int read_line(char str[]) {
int c, i=0;
c = getchar();
while (c != '\n' && c != EOF) { 
   str[i] = c;
   c = getchar();
   i++;
}
str[i] = '\0';
return i;
}
1
ayush bhorse
#include<stdio.h>
int main()
{
   char name[100];
   printf("Enter your name: ");
   scanf("%[^\n]s",name);
   printf("Your Name is: %s",name);
   return 0;
}
1
Pranta Palit

複数の行を読む必要がある場合は、バッファをクリアする必要があります。例:

int n;
scanf("%d", &n);
char str[1001];
char temp;
scanf("%c",&temp); // temp statement to clear buffer
scanf("%[^\n]",str);
1
levan

このコードを使用すると、キーボードのEnterキーを押すまで入力できます。

char ch[100];
int i;
for (i = 0; ch[i] != '\n'; i++)
{
    scanf("%c ", &ch[i]);
}
1
iFTEKHAR LIVE

正しい答えはこれです:

#include <stdio.h>

int main(void)
{
    char name[100];

    printf("Enter your name: ");
    // pay attention to the space in front of the %
    //that do all the trick
    scanf(" %[^\n]s", name);
    printf("Your Name is: %s", name);

    return 0;
}

あなたのプログラムの中に別のいくつかのscanfがある場合、整数値の1 scanfとdouble値の別のscanfがあるとしましょう...あなたのcharのscanfに達すると、%の前のスペースは非常に重要です。 name)そのコマンドはスキップされ、値を入力することはできません...しかし、そのスペースを%の前に置いても問題ないでしょう。

0

"Barack Obama"は、 "Barack"と "Obama"の間にスペースがあります。それに対応するために、このコードを使用してください。

#include <stdio.h>
int main()
{
    printf("Enter your name\n");
   char a[80];
   gets(a);
   printf("Your name is %s\n", a);
   return 0;
}
0
Koech

上記のメソッドは機能しますが、それぞれに問題があります。

Posix対応プラットフォームを使用している場合は、getline()またはgetdelim()を使用できます。あなたがコンパイラとしてwindowsとminigwを使っているなら、それは利用可能であるべきです。

getline()は次のように定義されています。

ssize_t getline(char **lineptr, size_t *n, FILE *stream);

入力を受け取るには、まずchar型へのポインタを作成する必要があります。

#include <stdio.h>
#include<stdlib.h>

// s is a pointer to char type.
char *s;
// size is of size_t type, this number varies based on your guess of 
// how long the input is, even if the number is small, it isn't going 
// to be a problem
size_t size = 10;

int main(){
// allocate s with the necessary memory needed, +1 is added 
// as its input also contains, /n character at the end.
    s = (char *)malloc(size+1);
    getline(&s,&size,stdin);
    printf("%s",s);
    return 0;
}

入力例:Hello world to the world!

出力:Hello world to the world!\n

ここで注意すべきことは、sに割り当てられたメモリが11バイトだとしても、入力サイズが26バイトなので、getlineはrealloc()を使ってsを再割り当てすることです。

だからあなたの入力がどれくらい長いかは関係ありません。

上記の入力例のように、sizeは読み取られたno.ofバイトで更新され、size27になります。

getline()はまた\nを入力とみなします。あなたの 's'は最後に '\ n'を保持します。

より一般的なバージョンのgetline()もあります。これはgetdelim()で、もう1つ追加の引数、つまりdelimiterを取ります。

getdelim()は次のように定義されています。

ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);

Linuxのmanページ

0
nilsocket