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