我正在使用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
如何让程序读取整个名称?
答案 0 :(得分:162)
使用:
fgets (name, 100, stdin);
100
是缓冲区的最大长度。您应该根据需要进行调整。
使用:
scanf ("%[^\n]%*c", name);
[]
是扫描集字符。 [^\n]
告诉我,当输入不时,换行符('\n'
)接受输入。然后使用%*c
从输入缓冲区读取换行符(未读取),*
表示此读取输入被丢弃(赋值抑制),因为您不需要它,缓冲区中的这个换行符不会对您可能采取的下一个输入产生任何问题。
请在此处阅读scanset和assignment suppression运营商。
请注意,您也可以使用gets
但....
永远不要使用
gets()
。因为在不事先知道数据的情况下不可能分辨出get()将读取多少个字符,并且因为gets()
将继续存储超过缓冲区末尾的字符,所以使用它是非常危险的。它已被用来打破计算机安全。请改用fgets()
。
答案 1 :(得分:21)
试试这个:
scanf("%[^\n]s",name);
\n
只设置扫描字符串的分隔符。
答案 2 :(得分:5)
以下是如何使用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;
}
答案 3 :(得分:4)
scanf(" %[^\t\n]s",&str);
str
是从中获取字符串的变量。
答案 4 :(得分:2)
注意:当使用fgets()时,当您在CLI(命令行解释器)中对小输入使用fgets()时,数组中的最后一个字符将为'\ n',因为您使用'Enter'结束字符串”。因此,当您打印字符串时,编译器将始终在打印字符串时转到下一行。如果您希望输入字符串具有类似行为的空终止字符串,请使用此简单的hack。
#include<stdio.h>
int main()
{
int i,size;
char a[100];
fgets(a,100,stdin);;
size = strlen(a);
a[size-1]='\0';
return 0;
}
更新:在其他用户的帮助下更新。
答案 5 :(得分:1)
#include<stdio.h>
int main()
{
char name[100];
printf("Enter your name: ");
scanf("%[^\n]s",name);
printf("Your Name is: %s",name);
return 0;
}
答案 6 :(得分:1)
使用此代码,您可以输入输入直到按下键盘输入。
char ch[100];
int i;
for (i = 0; ch[i] != '\n'; i++)
{
scanf("%c ", &ch[i]);
}
答案 7 :(得分:1)
#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;
}
答案 8 :(得分:1)
如果需要读取多行,则需要清除缓冲区。示例:
int n;
scanf("%d", &n);
char str[1001];
char temp;
scanf("%c",&temp); // temp statement to clear buffer
scanf("%[^\n]",str);
答案 9 :(得分:0)
#include <stdio.h>
int main()
{
printf("Enter your name\n");
char a[80];
gets(a);
printf("Your name is %s\n", a);
return 0;
}
答案 10 :(得分:0)
正确的答案是:
coding folder/
main.py
templates/
----profile.html
%前面的空格是非常重要的,因为如果你在程序中有另外几个scanf,假设你有一个整数值的scanf和另一个具有double值的scanf ...当你到达scanf为你的char(字符串名称)该命令将被跳过并且您无法为其输入值...但是如果您将该空格放在%之前将是一切都没有,不会跳过任何内容。
答案 11 :(得分:0)
虽然上述方法确实有效,但每个方法都有自己的问题。
如果您使用的是posix支持的平台,则可以使用getline()
或getdelim()
。
如果您使用windows和minigw作为编译器,那么它应该可用。
getline()
定义为:
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
为了获取输入,首先需要创建一个指向char类型的指针。
#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;
}
示例输入:Hello world to the world!
输出:Hello world to the world!\n
这里需要注意的一点是,即使为s分配的内存是11个字节,
在输入大小为26个字节的情况下,getline使用s
重新分配realloc()
。
所以输入的时间长短无关紧要。
size
已更新,读取的字节数为no,因为上面的示例输入size
将为27
。
getline()
也会将\n
视为输入。所以你的''将在最后保留'\ n'。
还有更getline()
的通用版本,即getdelim()
,它还需要一个额外的参数,即delimiter
。
getdelim()
定义为:
ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);
答案 12 :(得分:-1)
"%s"
将读取输入,直到到达空格。
gets可能是一个好的起点。
答案 13 :(得分:-3)
scanf("%s",name);
将&
与scanf
输入