6

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

4

5 回答 5

14

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

于 2010-10-26T16:22:56.900 回答
3
char str[100];

试试这个

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

或这个

fgets(str, sizeof str, stdin))
于 2013-01-25T05:15:04.717 回答
2

创建您自己的函数来读取一行。这就是您基本上必须做的事情:

1. fgets 进入分配的(可增长的)内存
2. 如果它是一个完整的行,你就完成了
3. 增加数组
4. fgets 更多字符到新分配的内存中
5.转到2。

实现可能有点棘手:-)

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


编辑

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

得到一个字符
它是EOF吗?完毕
添加到数组(更新长度),可能会增加它(更新大小)
是'\n'吗?完毕
重复
于 2010-10-26T18:28:27.223 回答
1

你想什么时候停止阅读?在 EOF 上,在一个特定的字符上,还是什么?

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

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

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

[ 匹配指定的可接受字符集中的非空字符序列;next 指针必须是指向 char 的指针,并且必须有足够的空间容纳字符串中的所有字符,外加一个终止 NUL 字符。前导空白的通常跳过被抑制。字符串由特定集合中(或不在)中的字符组成;该集合由左括号 [ 字符和右括号 ] 字符之间的字符定义。如果左括号后的第一个字符是抑扬符 ^,则该集合排除这些字符。要在集合中包含右括号,请将其作为左括号或抑扬符之后的第一个字符;任何其他位置将结束该组。连字符 - 也很特殊;当放置在其他两个字符之间时,它会将所有中间字符添加到集合中。要包含连字符,请将其设为最后一个右括号之前的最后一个字符。例如,“[^]0-9-]”表示集合“除了右括号、0 到 9 和连字符之外的所有内容”。字符串以出现不在(或,带有转号,in)集合中的字符或字段宽度用完时结束 使其成为最后一个右括号之前的最后一个字符。例如,“[^]0-9-]”表示集合“除了右括号、0 到 9 和连字符之外的所有内容”。字符串以出现不在(或,带有转号,in)集合中的字符或字段宽度用完时结束 使其成为最后一个右括号之前的最后一个字符。例如,“[^]0-9-]”表示集合“除了右括号、0 到 9 和连字符之外的所有内容”。字符串以出现不在(或,带有转号,in)集合中的字符或字段宽度用完时结束

于 2010-10-26T16:26:25.650 回答
1

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

char name[30],ch;

i=1;
while((ch=getchar())!='\n')
{
name[i]=ch;
i++;
}
i++;
name[i]='\n';
printf("String is %s",name);
于 2013-01-25T04:48:54.850 回答