scanf("%s",str) 不会这样做。它将在第一个空格处停止阅读。当字符串很大时,gets(str) 也不起作用。有任何想法吗?
5 回答
使用带有 STDIN 的fgets作为文件流。然后,您可以指定要读取的数据量以及放置位置。
char str[100];
试试这个
scanf("%[^\n]s",str);
或这个
fgets(str, sizeof str, stdin))
创建您自己的函数来读取一行。这就是您基本上必须做的事情:
1. fgets 进入分配的(可增长的)内存 2. 如果它是一个完整的行,你就完成了 3. 增加数组 4. fgets 更多字符到新分配的内存中 5.转到2。
实现可能有点棘手:-)
您需要考虑需要传递给函数的内容(至少是数组的地址及其大小);以及当一切“正常”或出现错误时函数返回的内容。您需要确定什么是错误(是一个 10GB 长且没有 '\n' 错误的字符串吗?)。您需要决定如何增长阵列。
编辑
实际上它可能更好,fgetc
而不是fgets
得到一个字符 它是EOF吗?完毕 添加到数组(更新长度),可能会增加它(更新大小) 是'\n'吗?完毕 重复
你想什么时候停止阅读?在 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)集合中的字符或字段宽度用完时结束
要读取带空格的字符串,您可以执行以下操作:
char name[30],ch;
i=1;
while((ch=getchar())!='\n')
{
name[i]=ch;
i++;
}
i++;
name[i]='\n';
printf("String is %s",name);