如何读取C语言中包含空格的字符串

如何读取C语言中包含空格的字符串

问题描述:

当字符串在单词之间包含空格时,从C中键盘读取字符串的最准确方法是什么?当我为此使用scanf时,它不会读取带空格的字符串。第二种选择是使用gets,但它应该是有害的(我也想知道为什么?)。另一个是我不想要使用任何文件处理概念,如fgets。如何读取C语言中包含空格的字符串

+2

字符串如何输入系统?由用户?从一个文件?从TTY?在套接字上?这太宽了...... – RedX

+0

用户通过键盘 –

+3

你可能想'fgets'。 –

@ 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; 
} 
+1

如果我*立即*按提示上的^^D会发生什么情况? (我在一个类似Linux的系统上,所以“你得到一个包含'^ D'的字符串不是一个有效的答案。) – usr2564301

+0

我给了他一个基本的例子,就如何从键盘读取而不是使用scanf()并获得功能。基本上有多种方法可以避免显示EOF(Ctrl + D)。问的问题是关于使用scanf()或获取或其他函数的有效性。因此,出于这两个我的意见/我喜欢fgets()。如果我所表达/解释的是错误的,那么请纠正我,因为我愿意在这里学习。这就是我加入这个社区的原因。 –

+2

我提到它是因为它会导致长度为** 0的输入字符串,'strlen(str)-1'会尝试访问不允许的内存。你应该总是检查'fgets'的返回结果,它*特别*检查[没有输入字符的输入结束](https://linux.die.net/man/3/fgets)。 – usr2564301

这2种方式来读取包含不使用getsfgets

空格的字符串
  1. 您可以使用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 
    } 
    
  2. 如果你绝对要scanf,在这个例子中读取到行结束,除非行比指定的字符数减去1的分隔符更多。在后一种情况下,该行会被截断,您将在下一个scanf调用中获得剩余的字符。

    char line[1024]; 
    while (scanf("%1023[^\n]\n", line) == 1) { 
        // do something with line 
    } 
    
  3. 我还要指出的是,当你从键盘scanf例如读取字符串时,实际上是从文件中读取与文件指针stdin。所以你真的不能避免“任何文件处理概念”

开始=>
+0

大小格式不包括终止空字节格式中的数字应该是1023. –

+0

感谢您指出这@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