如何解决传递给 fgets 的正确长度
如果我有以下缓冲区:
char buffy[40]; // includes \0 at the end
fgets
函数的 STLEN
应该是 40 还是 39?为什么?
char buffy[40];
while (fgets(buffy,40,fp) != EOF)
// ...
解决方法
fgets
读入的字符数最多比其第二个参数的值少 1。所以在这种情况下,正确的值应该是 40。它将最多读取 39 个字符,数组的最后一个元素将用于存储 '\0'。这确保不会发生缓冲区溢出。作为成语
fgets(buf,sizeof buf,fp)
可以在(且仅当)数组 buf
的声明可见时使用。
请注意,将其称为fgets(buf,39,fp)
并没有错,但这会导致它最多读入38个字符,并且'\0'将存储在buf[38]
中(如果是38已读取字符)。根本不会使用数组的最后一个元素 (buf[39]
)。
根据 C11 7.21.7.2 The fgets function:
概要
function makeSearch() {
var qty = document.getElementById('qty').value;
if (qty > 5) {
alert("Maximum 5 toy available.")
return false
}
var cname = document.getElementById('cname').value;
var tenure = document.getElementById('tenure').value;
var toy = document.getElementById('toy_name').value;
var rent = qty * tenure * toy;
var answer = window.confirm("Total rental cost = " + rent);
if (answer) {
alert("Thank you for order Mr/Ms/Mrs: " + cname);
window.location.reload();
} else {
alert("Order cancelled.")
window.location.reload();
}
return false
}
code after
return :
<
tr >
<
td >
Number Of toys available <
/td> <
td >
<
input type = "number"
name = "avail"
id = "avail"
value = ""
readonly ref = ""
required > < /input> < /
td > <
/tr> <
tr >
说明
#include <stdio.h>
char *fgets(char * restrict s,int n,FILE * restrict stream);
函数从 stream 指向的流中读取至多比 fgets
指定的字符数少 1 到 n
指向的数组中。在换行符(保留)后或文件结束后不会读取其他字符。在读入数组的最后一个字符后立即写入空字符。
所以
s
是正确的,但是
char buffy[40];
while (fgets(buffy,40,fp) != NULL)
会更好。
,如果你会写例如
fgets(buffy,fp)
那么函数 fgets
将一无所知,数组实际上包含 40
个字符。:)
因此数组的 40-th
元素将不会被使用并且是多余的。
当您使用 40
个字符声明数组时
char buffy[40];
然后在 fgets
的调用中使用所有这些,例如
fgets(buffy,sizeof( buffy ),fp)
该函数将从不超过 39 个字符的字符串中读取并在数组中附加零字符 '\0'
。
如果您需要从输入的字符串中删除换行符'\n'
,那么您可以编写例如
buffy[ strcspn( buffy,"\n" ) ] = '\0';
,
如fgets
docs中所述:
参数:
...
n - 这是要读取的最大字符数(包括最后一个空字符)。通常使用作为 str 传递的数组长度。
因此,如果数组长度为 40,则应使用 40。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。