用空格字符从输入中读取字符串?

我正在使用 Ubuntu,并且使用 Geany 和 CodeBlock 作为我的 IDE。 我要做的是读取一个字符串(比如 "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

我怎样才能让程序读取整个名称?

593820 次浏览

"%s" will read the input until whitespace is reached.

如果您想读取一行,gets 可能是一个很好的开始位置(即所有字符,包括空格,直到到达换行字符)。

用途:

fgets (name, 100, stdin);

100是缓冲区的最大长度。您应该根据需要调整它。

Use:

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

[]是扫描集字符。[^\n]告诉输入为 没有时,换行('\n')接受输入。然后,使用 %*c,它从输入缓冲区读取换行符(未读取) ,而 *表示这个输入读取被丢弃(分配抑制) ,因为您不需要它,而且缓冲区中的这个换行符不会对您可能接受的下一个输入造成任何问题。

阅读这里关于 scanset任务取消操作符的内容。

注意,您也可以使用 gets,但是... ..。

永远不要使用 gets()。因为如果事先不知道 get ()将读取多少字符,就不可能知道数据,而且因为 gets()将继续存储超过缓冲区末尾的字符,所以使用它是非常危险的。它被用来破坏计算机安全。使用 fgets()代替。

试试这个:

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

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

下面是如何使用 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;
}
scanf(" %[^\t\n]s",&str);

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

scanf("%s",name);

使用 &scanf输入

“巴拉克 · 奥巴马”在“巴拉克”和“奥巴马”之间有一个空格

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

注意: 当使用 fgets ()时,当在 CLI (命令行解释器)中对小输入使用 fgets ()时,数组中的最后一个字符有时会是’n’,因为字符串以‘ Enter’结束。所以当你打印字符串时,编译器总是在打印字符串的时候转到下一行。如果您希望输入字符串具有类似于以 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;
}

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

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

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

正确答案是:

#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,假设你有一个整数值的 Scanf 和另外一个双精度的 Scanf... 当你到达 char (字符串名称)的 Scanf 时,这个命令会被跳过,你不能为它输入值... 但是如果你把这个空格放在% 前面,那么一切都没问题,不会跳过任何东西。

#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;
}

虽然上面提到的方法确实有效,但是每种方法都有自己的问题。

如果您使用的是 posix 支持的平台,那么可以使用 getline()getdelim()。 如果您使用 windows 和 minigw 作为编译器,那么它应该是可用的。

getline() is defined as :

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

In order to take input, first you need to create a pointer to char type.

#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;
}

Sample Input:Hello world to the world!

输出: Hello world to the world!\n

One thing to notice here is, even though allocated memory for s is 11 bytes, where as input size is 26 bytes, getline reallocates s using realloc().

So it doesn't matter how long your input is.

按照上面的示例输入,size将为 27

getline()也考虑 \n作为输入,所以你的‘ s’将在结尾保持‘ n’。

还有更通用的 getline()版本,即 getdelim(),它接受另一个额外的参数,即 delimiter

getdelim()的定义是:

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

Linux 手册页

如果需要读取多行,则需要清除 buffer。例如:

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