c 语言字符串输入空格,c - 从具有空格字符的输入中读取字符串?

c - 从具有空格字符的输入中读取字符串?

这个问题在这里已有答案:

如何使用scanf输入空格?                                     11个答案

我使用的是Ubuntu,我也使用Geany和CodeBlock作为我的IDE。我想要做的是读取一个字符串(如"Barack Obama")并将其放在一个变量中:

#include

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

如何让程序读取整个名称?

14个解决方案

160 votes

使用:

fgets (name, 100, stdin);

gets()是缓冲区的最大长度。 您应该根据需要进行调整。

使用:

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

gets()是扫描集字符。 gets()告诉输入不是换行符(fgets())时输入。 然后使用%*c从输入缓冲区读取换行符(未读取),*指示此读入输入被丢弃(赋值抑制),因为您不需要它,并且缓冲区中的这个换行符确实如此 不会为您可能采取的下一个输入创建任何问题。

请阅读此处有关scanset和赋值抑制运算符的信息。

注意你也可以使用gets()但....

永远不要使用gets().因为在事先不知道数据的情况下无法判断将读取多少个字符(),并且因为gets()将继续存储超过缓冲区末尾的字符,所以使用它是非常危险的。 它已被用来打破计算机安全。 请改用fgets()。

phoxis answered 2019-08-23T13:45:22Z

21 votes

试试这个:

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

\n只设置扫描字符串的分隔符。

Sridhar Iyer answered 2019-08-23T13:45:52Z

5 votes

下面是一个如何使用fgets函数获取包含空格的输入的示例。

#include

int main()

{

char name[100];

printf("Enter your name: ");

fgets(name, 100, stdin);

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

return 0;

}

kyle k answered 2019-08-23T13:46:19Z

4 votes

scanf(" %[^\t\n]s",&str);

str是从中获取字符串的变量。

animesh answered 2019-08-23T13:46:46Z

2 votes

注意:使用fgets()时,数组中的最后一个字符将是' \ n' 有时在CLI(命令行解释器)中使用fgets()作为小输入,当你用' Enter'结束字符串时。 因此,当您打印字符串时,编译器将始终在打印字符串时转到下一行。 如果您希望输入字符串具有类似行为的空终止字符串,请使用此简单的hack。

#include

int main()

{

int i,size;

char a[100];

fgets(a,100,stdin);;

size = strlen(a);

a[size-1]='\0';

return 0;

}

更新:在其他用户的帮助下更新。

Ritesh Sharma answered 2019-08-23T13:47:23Z

1 votes

#include

int main()

{

char name[100];

printf("Enter your name: ");

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

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

return 0;

}

Pranta Palit answered 2019-08-23T13:47:42Z

1 votes

使用此代码,您可以输入输入直到按下键盘输入。

char ch[100];

int i;

for (i = 0; ch[i] != '\n'; i++)

{

scanf("%c ", &ch[i]);

}

iFTEKHAR LIVE answered 2019-08-23T13:48:09Z

1 votes

#include

// 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;

}

ayush bhorse answered 2019-08-23T13:48:29Z

1 votes

如果需要读取多行,需要清除缓冲区。 例:

int n;

scanf("%d", &n);

char str[1001];

char temp;

scanf("%c",&temp); // temp statement to clear buffer

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

levan answered 2019-08-23T13:48:59Z

0 votes

"巴拉克奥巴马" Barack'之间有一个空间。 和奥巴马'。 为了适应这种情况,请使用此代码;

#include

int main()

{

printf("Enter your name\n");

char a[80];

gets(a);

printf("Your name is %s\n", a);

return 0;

}

Koech answered 2019-08-23T13:49:27Z

0 votes

虽然上述方法确实有效,但每个方法都有其自身的问题。

如果您使用的是posix支持的平台,可以使用ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);或getdelim()。如果您使用Windows和minigw作为编译器,那么它应该可用。

ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);定义为:

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

为了获取输入,首先需要创建一个指向char类型的指针。

#include

#include

// 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;

}

样本输入:ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);

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

这里需要注意的一点是,即使为s分配的内存是11个字节,在输入大小为26字节的情况下,getline使用getdelim()重新分配ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);。

因此,输入的时间并不重要。

ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);更新为no.of字节读取,如上面的示例输入getdelim()将是delimiter。

ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);也认为getdelim()为输入。所以你的' 将举行' \ n' 在末尾。

还有更为通用的版本ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);,即getdelim(),它还需要一个额外的参数,即delimiter。

ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);定义为:

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

Linux手册页

nilsocket answered 2019-08-23T13:51:36Z

-1 votes

"%s"将读取输入,直到到达空格。

如果你想读取一行(即所有字符包括空格直到到达换行符),get可能是一个好的起点。

davin answered 2019-08-23T13:52:11Z

-1 votes

正确答案是这样的:

#include

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让我们说你有一个整数值的scanf和另一个具有double值的scanf ...当你到达scanf时 你的char(字符串名称)该命令将被跳过,你不能为它输入值...但是如果你把那个空间放在%之前就可以了,一切都没有跳过。

Cristian Babarusi answered 2019-08-23T13:52:49Z

-3 votes

scanf("%s",name);

使用&和scanf输入

Vi_Hari answered 2019-08-23T13:53:21Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值