如何读取C语言中包含空格的字符串
当字符串在单词之间包含空格时,从C中键盘读取字符串的最准确方法是什么?当我为此使用scanf时,它不会读取带空格的字符串。第二种选择是使用gets,但它应该是有害的(我也想知道为什么?)。另一个是我不想要使用任何文件处理概念,如fgets。如何读取C语言中包含空格的字符串
@ user3623265,
请找到它使用与fgets读取从标准输入字符串的示例程序。
请参阅一些示例C文档,了解fgets如何用于从键盘获取字符串以及stdin的用途。
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[80];
int i;
printf("Enter a string: ");
fgets(str, sizeof(str), stdin);
i = strlen(str) - 1;
if (str[i] == '\n')
str[i] = '\0';
printf("This is your string: %s", str);
return 0;
}
如果我*立即*按提示上的^^D会发生什么情况? (我在一个类似Linux的系统上,所以“你得到一个包含'^ D'的字符串不是一个有效的答案。) – usr2564301
我给了他一个基本的例子,就如何从键盘读取而不是使用scanf()并获得功能。基本上有多种方法可以避免显示EOF(Ctrl + D)。问的问题是关于使用scanf()或获取或其他函数的有效性。因此,出于这两个我的意见/我喜欢fgets()。如果我所表达/解释的是错误的,那么请纠正我,因为我愿意在这里学习。这就是我加入这个社区的原因。 –
我提到它是因为它会导致长度为** 0的输入字符串,'strlen(str)-1'会尝试访问不允许的内存。你应该总是检查'fgets'的返回结果,它*特别*检查[没有输入字符的输入结束](https://linux.die.net/man/3/fgets)。 – usr2564301
这2种方式来读取包含不使用gets
或fgets
-
您可以使用
getline
(2008 POSIX可能不存在您的系统),可以方便地管理足够大小的缓冲区分配以捕捉整条线路。char *line = NULL; size_t bufsize = 0; size_t n_read; // number of characters read including delimiter while ((n_read = getline(&line, &bufsize, stdin)) > 1 && line != NULL) { // do something with line }
-
如果你绝对要
scanf
,在这个例子中读取到行结束,除非行比指定的字符数减去1的分隔符更多。在后一种情况下,该行会被截断,您将在下一个scanf
调用中获得剩余的字符。char line[1024]; while (scanf("%1023[^\n]\n", line) == 1) { // do something with line }
我还要指出的是,当你从键盘scanf
例如读取字符串时,实际上是从文件中读取与文件指针stdin
。所以你真的不能避免“任何文件处理概念”
大小格式不包括终止空字节格式中的数字应该是1023. –
感谢您指出这@JonathanLeffler –
如果你坚持没有FILE *范围,使用getchar()。
char buff[1024];
int ch;
int i = 0;
while((ch = getchar()) != '\n')
if(i < 1023)
buff[i++] = ch;
buff[i] = 0;
/* now move string into a smaller buffer */
通常情况下,stdout和stdin以及FILE *都可用。你的需求有点奇怪,因为你显然不是一个高级C程序员,他有一个不寻常的需要压制FILE *符号,我怀疑你对C IO的理解是不稳定的。
还有第三个选项,您可以用read()
通话读取stdin
原始数据:
#include <unistd.h>
int main(void) {
char buf[1024];
ssize_t n_bytes_read;
n_bytes_read = read(STDIN_FILENO, buf, sizeof(buf) - 1);
if (n_bytes_read < 0) {
// error occured
}
buf[n_bytes_read] = '\0'; // terminte string
printf("\'%s\'", buf);
return 0;
}
请不是每个输入被复制到原料包括buf
尾随回报。也就是说,如果你输入Hello World
你会得到
'Hello World
'
作为输出。尝试online。
字符串如何输入系统?由用户?从一个文件?从TTY?在套接字上?这太宽了...... – RedX
用户通过键盘 –
你可能想'fgets'。 –