163

次のコードを使用します。

char *name = malloc(sizeof(char) + 256); 

printf("What is your name? ");
scanf("%s", name);

printf("Hello %s. Nice to meet you.\n", name);

ユーザーは自分の名前を入力できますが、 のようLucas Aardvarkにスペースを含む名前を入力すると、 のscanf()後のすべてが切り捨てられますLucasscanf()スペースを許可する方法

4

11 に答える 11

227

人々 (特に初心者) は、入力が常に特定の形式であることが確実にわかっていない限り (そしておそらくそうではない場合でも)、バッファー オーバーフロー保護を持たない やその他の関数をscanf("%s")使用しないでください。gets()

scanf「スキャン形式」の略であり、ユーザーが入力したデータよりも形式が少し劣っていることを覚えておいてください。入力データ形式を完全に制御できる場合は理想的ですが、一般的にユーザー入力には適していません。

入力を文字列に取得して評価するには、 fgets()(バッファ オーバーフロー保護を備えた) を使用します。ユーザーが解析せずに入力したものだけが必要なので、この場合はとにかくsscanf()必要ありません。sscanf()

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

/* Maximum name size + 1. */

#define MAX_NAME_SZ 256

int main(int argC, char *argV[]) {
    /* Allocate memory and check if okay. */

    char *name = malloc(MAX_NAME_SZ);
    if (name == NULL) {
        printf("No memory\n");
        return 1;
    }

    /* Ask user for name. */

    printf("What is your name? ");

    /* Get the name, with size limit. */

    fgets(name, MAX_NAME_SZ, stdin);

    /* Remove trailing newline, if there. */

    if ((strlen(name) > 0) && (name[strlen (name) - 1] == '\n'))
        name[strlen (name) - 1] = '\0';

    /* Say hello. */

    printf("Hello %s. Nice to meet you.\n", name);

    /* Free memory and exit. */

    free (name);
    return 0;
}
于 2009-08-08T04:59:36.630 に答える
141

試す

char str[11];
scanf("%10[0-9a-zA-Z ]", str);

それが役立つことを願っています。

于 2009-08-08T04:39:18.967 に答える
63

この例では逆スキャンセットを使用しているため、scanf は '\n'-- 改行に遭遇するまで値を取り込み続けるため、スペースも節約されます

#include <stdio.h>

int main (int argc, char const *argv[])
{
    char name[20];

    // get up to buffer size - 1 characters (to account for NULL terminator)
    scanf("%19[^\n]", name);
    printf("%s\n", name);
    return 0;
}
于 2009-08-09T14:31:26.317 に答える
26

これを使用できます

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

またはこれ

void getText(char *message, char *variable, int size){
    printf("\n %s: ", message);
    fgets(variable, sizeof(char) * size, stdin);
    sscanf(variable, "%[^\n]", variable);
}

char name[20];
getText("Your name", name, 20);

デモ

于 2013-08-22T03:24:47.387 に答える
7

fgets()関数を使用して文字列を読み取るか、文字scanf("%[^\n]s",name);列の読み取りが改行文字に遭遇すると終了するように使用できます。

于 2012-09-17T12:17:31.217 に答える
1

scanfちょっとしたコツでこの目的に使用できます。実際には、ユーザーが Enter ( ) を押すまでユーザー入力を許可する必要があります\nこれは、スペースを含むすべての文字を考慮します。次に例を示します。

int main()
{
  char string[100], c;
  int i;
  printf("Enter the string: ");
  scanf("%s", string);
  i = strlen(string);      // length of user input till first space
  do
  {
    scanf("%c", &c);
    string[i++] = c;       // reading characters after first space (including it)
  } while (c != '\n');     // until user hits Enter
  string[i - 1] = 0;       // string terminating
return 0;
}

これはどのように機能しますか?ユーザーが標準入力から文字を入力すると、最初の空白スペースまで文字列変数に格納されます。その後、エントリの残りは入力ストリームに残り、次の scanf を待ちます。次に、for入力ストリームから char ごとに char を取得し ( \ntil まで)、それらを文字列変数の末尾に追加して、キーボードからのユーザー入力と同じ完全な文字列を形成するループがあります。

これが誰かを助けることを願っています!

于 2015-01-18T11:06:05.747 に答える
0

またはscanf()などのはるかに優れた呼び出しがあるため、この種のことには実際に使用しないでください。実行できます。gets()getline()

#include <stdio.h>

char* scan_line(char* buffer, int buffer_size);

char* scan_line(char* buffer, int buffer_size) {
   char* p = buffer;
   int count = 0;
   do {
       char c;
       scanf("%c", &c); // scan a single character
       // break on end of line, string terminating NUL, or end of file
       if (c == '\r' || c == '\n' || c == 0 || c == EOF) {
           *p = 0;
           break;
       }
       *p++ = c; // add the valid character into the buffer
   } while (count < buffer_size - 1);  // don't overrun the buffer
   // ensure the string is null terminated
   buffer[buffer_size - 1] = 0;
   return buffer;
}

#define MAX_SCAN_LENGTH 1024

int main()
{
   char s[MAX_SCAN_LENGTH];
   printf("Enter a string: ");
   scan_line(s, MAX_SCAN_LENGTH);
   printf("got: \"%s\"\n\n", s);
   return 0;
}
于 2016-09-29T23:52:19.940 に答える
0
/*reading string which contains spaces*/
#include<stdio.h>
int main()
{
   char *c,*p;
   scanf("%[^\n]s",c);
   p=c;                /*since after reading then pointer points to another 
                       location iam using a second pointer to store the base 
                       address*/ 
   printf("%s",p);
   return 0;
 }
于 2019-05-15T13:58:18.357 に答える