我想采取字符数组控制台,它也包括空格,我知道在C中的唯一方法是scanf函数,但它错过停止服用输入,一旦击中空白。 我该做什么?
下面是我在做什么。
char address[100];
scanf("%s", address);
我想采取字符数组控制台,它也包括空格,我知道在C中的唯一方法是scanf函数,但它错过停止服用输入,一旦击中空白。 我该做什么?
下面是我在做什么。
char address[100];
scanf("%s", address);
尝试使用与fgets()。 它将从您所选择的流中读取一个完整的线(标准输入,我猜你正在寻找)。 您的情况的一个例子:
char address[100];
fgets(address, 100, stdin);
与fgets()的读出在第二个参数(减一)通过字符最多数量。 没有缓冲区溢出,你会得到整个线直至并包括一个换行符(或最多EOF)。 需要注意的是,因为要读取的字符的最大数量是参数之一,它是可能的,你会得到一个部分行。 请检查是否在返回字符串中的最后一个字符是“\ n”,你就会知道你有一个完整的线。 EOF检测是非常简单过; 一个NULL
的返回值和检查errno
应该帮助你。
由于克里斯(下面)下进行约局部线的点。
你可以尝试这样的事情:
char str[100];
scanf("%99[0-9a-zA-Z ]s", str);
printf("%s\n", str);
有办法做到这一点的scanf()
,但在我的愚见,他们变得丑陋快。 共用图案(即出人意料地尚未提及)是读取与所述串fgets()
然后使用sscanf()
来处理它。 sscanf()
就像scanf()
,而不是只处理标准输入流,它处理你传递给它一个字符串(以同样的方式printf()
和sprintf()
是相关的)。 基础:
char s[100], str[100];
int i, x;
fgets(s, 100, stdin);
if(sscanf(s, "%d %x %s", &i, &x, str) != 3)
{
// our three variables weren't all set - probably an invalid string
// either handle the error or set default values here.
}
见fgets()
fgets()
读取比从流,并将它们存储大小的字符以下的至多一个到缓冲由s指向。 一个EOF或换行后读停止。 如果一个换行符被读取,它被保存到缓冲区。 A“\ 0”在缓冲器中的最后一个字符之后存储。
char *fgets(char *s, int size, FILE *stream);
在许多问题SO可用的进一步细节,例如输入串贯通scanf的 。
(由于大众需求,refrence以gets()
被移除)
我个人用fgets,但已经被指出了这里。 使用scanf函数会doiung它的一种方式
scanf("%[^\n]", address);
直到“\ n”发现这需要在所有的字符。
如果你想使用内部结构动态数组采取输入到新的生产线,这可能是有用的:
#include<stdio.h>
#include<stdlib.h>
struct student{
char *name;
};
int main()
{
struct student s;
s.name = malloc(sizeof(char *));
printf("Name: ");
// fgets(s.name, 10, stdin); // this would limit your input to 10 characters.
scanf("%[^\n]", s.name);
printf("You Entered: \n\n");
printf("%s\n", s.name);
}
我的风格。
#include <stdio.h>
#define charIsimUzunlugu 30
struct personelTanim
{
char adSoyad[charIsimUzunlugu];
} personel;
printf(" your char : ");
scanf("%[^\n]",personel.adSoyad);
printf("\n\n%s",personel.adSoyad);