次のコードを使用します。
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()
はLucas
の後のすべてを切り捨てます。 scanf()
でスペースを許可する方法
人々(および特に初心者)は、scanf("%s")
やgets()
、またはバッファオーバーフロー保護を持たない他の関数を使用しないでください。その時でさえ)。
scanf
は「スキャンフォーマット済み」の略で、ユーザーが入力したデータよりも貴重なlessフォーマット済みであることに注意してください。入力データ形式を完全に制御できるが、一般にユーザー入力には適さない場合に理想的です。
fgets()
(これはhasバッファーオーバーフロー保護)を使用して入力を文字列に取得し、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;
}
試して
char str[11];
scanf("%10[0-9a-zA-Z ]", str);
お役に立てば幸いです。
この例では反転スキャンセットを使用しているため、scanfは '\ n'-改行に遭遇するまで値を取り込み続けるため、スペースも節約されます
#include <stdio.h>
int main (int argc, char const *argv[])
{
char name[20];
scanf("%[^\n]s",name);
printf("%s\n", name);
return 0;
}
これを使用できます
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);
scanf()
を使用して、フィールド幅を指定せずに文字列を読み取らないでください。エラーの戻り値も確認する必要があります。
#include <stdio.h>
#define NAME_MAX 80
#define NAME_MAX_S "80"
int main(void)
{
static char name[NAME_MAX + 1]; // + 1 because of null
if(scanf("%" NAME_MAX_S "[^\n]", name) != 1)
{
fputs("io error or premature end of line\n", stderr);
return 1;
}
printf("Hello %s. Nice to meet you.\n", name);
}
または、fgets()
を使用します。
#include <stdio.h>
#define NAME_MAX 80
int main(void)
{
static char name[NAME_MAX + 2]; // + 2 because of newline and null
if(!fgets(name, sizeof(name), stdin))
{
fputs("io error\n", stderr);
return 1;
}
// don't print newline
printf("Hello %.*s. Nice to meet you.\n", strlen(name) - 1, name);
}
fgets()
関数を使用して文字列を読み取るか、scanf("%[^\n]s",name);
を使用して、改行文字に遭遇すると文字列の読み取りが終了するようにできます。
誰かがまだ探しているなら、ここが私のために働いたものです-スペースを含む任意の長さの文字列を読むことです。
このシンプルでエレガントなソリューションを共有してくれたウェブ上の多くのポスターに感謝します。それが機能する場合、クレジットは彼らに行きますが、エラーは私のものです。
char *name;
scanf ("%m[^\n]s",&name);
printf ("%s\n",name);
この目的のために、ちょっとしたトリックでscanf
を使用できます。実際には、ユーザーがEnter(\n
)を押すまでユーザー入力を許可する必要があります。これは、以下を含むすべてのキャラクターを考慮します space。以下に例を示します。
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を待ちます。次に、入力ストリームからcharごとに(\n
まで)を取り、それらを末尾に追加するfor
ループがあります ひも 変数、したがって、キーボードからのユーザー入力と同じ完全な文字列を形成します。
これが誰かを助けることを願っています!
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;
}
/*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;
}