如何在C中读取包含空格的字符串?

scanf(“%s”,str)不会这样做。 它会在第一个空间停止阅读。 当字符串很大时,gets(str)也不起作用。 有任何想法吗?

使用带有STDIN的fgets作为文件流。 然后,您可以指定要读取的数据量以及放置位置。

 char str[100]; 

试试这个

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

或这个

 fgets(str, sizeof str, stdin)) 

创建自己的函数来读取一行。 这是你基本上要做的事情:

 fgets分配(可增长)内存
如果它是一个完整的线你就完成了
 3.种植arrays
 4.在新分配的内存中添加更多字符
 5.转到2。

实施可能有点棘手:-)

您需要考虑需要传递给函数的内容(至少是数组的地址及其大小); 当一切“正常”或出现错误时,函数返回什么。 您需要确定什么是错误(字符串长度为10Gbytes,没有’\ n’错误?)。 您需要决定如何增长arrays。


编辑

实际上fgetc而不是fgets可能更好

得到一个角色
它EOF?  DONE
添加到数组(更新长度),可能增长(更新大小)
是吗?\ n?  DONE
重复

你什么时候想停止阅读? 在EOF,在一个特定的角色,或什么?

您可以使用%c读取特定数量的字符

c匹配一系列宽度计数字符(默认值为1); 下一个指针必须是指向char的指针,并且必须有足够的空间容纳所有字符(不添加终止NUL)。 通常跳过前导空格被抑制。 要首先跳过空白区域,请使用格式中的显式空格。

你可以用%[读取特定字符(或最多被排除的字符)

[匹配指定的一组接受字符中的非空字符序列; 下一个指针必须是指向char的指针,并且字符串中的所有字符必须有足够的空间,以及终止NUL字符。 通常跳过前导空格被抑制。 该字符串由特定集合中的字符组成(或不在其中); 该集合由开括号[字符和近括号]字符之间的字符定义。 如果开括号之后的第一个字符是旋音^,则该集合将排除这些字符。 要在组中包含一个近括号,请将其作为开括号或旋转后的第一个字符; 任何其他位置将结束该集。 连字符 – 也很特别; 当放置在两个其他字符之间时,它会将所有插入字符添加到集合中。 要包含连字符,请将其设置为最后一个关闭括号之前的最后一个字符。 例如,`[^] 0-9-]’表示设置“除了紧括号,零到九和连字符’之外的所有东西。 字符串以字符的外观结束,而不是(或者,带有cir-cumflex,in)设置或字段宽度用完时

要读取带空格的字符串,您可以执行以下操作:

 char name[30],ch; i=1; while((ch=getchar())!='\n') { name[i]=ch; i++; } i++; name[i]='\n'; printf("String is %s",name);