我熟悉C中的sizeof
操作,但当我将它用于字符串"1234abcd"
时,它只返回4
,我假设它是最后4个字符的一部分。
那么我怎么能把它变成一个8号的字符串呢?
具体代码如下:
FILE *in_file;
in_file = fopen(filename, "r");
if (in_file == NULL) {
printf("File does not exist\n");
return 1;
}
int val_to_inspect = 0;
fscanf(in_file, "%x", &val_to_inspect);
while (val_to_inspect != 0) {
printf("%x", val_to_inspect);
int length = sizeof val_to_inspect;
printf("%d", length);
同样,从文件中读取的字符串是"1234abcd"
,只是为了澄清。
答案 0 :(得分:4)
这里有几个问题:
sizeof
运算符返回对象的大小。在这种情况下,它返回val_to_inspect
的大小,即int
。
http://en.cppreference.com/w/cpp/language/sizeof
fscanf
从流中读取并解释它。您只扫描整数("%x"),而不是字符串。
http://en.cppreference.com/w/cpp/io/c/fscanf
最后,如果您实际上有一个以nil结尾的字符串,要获得它的长度,您可以使用strlen()
。
答案 1 :(得分:2)
TL; DR ,要获取字符串的长度,您需要使用strlen()
。
尽管如此,在使用function(_dereq_, module, exports) {
var utils = _dereq_('./orb.utils');
var uiheaders = _dereq_('./orb.ui.header');
var themeManager = _dereq_('./orb.themes');
var uriHeader = 'data:application/vnd.ms-excel;base64,';
var docHeader = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40">' +
'<head>' +
'<meta http-equiv=Content-Type content="text/html; charset=UTF-8">' +
'<!--[if gte mso 9]><xml>' +
' <x:ExcelWorkbook>' +
' <x:ExcelWorksheets>' +
' <x:ExcelWorksheet>' +
' <x:Name>###sheetname###</x:Name>' +
' <x:WorksheetOptions>' +
' <x:ProtectContents>False</x:ProtectContents>' +
' <x:ProtectObjects>False</x:ProtectObjects>' +
' <x:ProtectScenarios>False</x:ProtectScenarios>' +
' </x:WorksheetOptions>' +
' </x:ExcelWorksheet>' +
' </x:ExcelWorksheets>' +
' <x:ProtectStructure>False</x:ProtectStructure>' +
' <x:ProtectWindows>False</x:ProtectWindows>' +
' </x:ExcelWorkbook>' +
'</xml><![endif]-->' +
'</head>' +
'<body>';
var docFooter = '</body></html>';
module.exports = function(pgridwidget) {
var config = pgridwidget.pgrid.config;
var currTheme = themeManager.current();
currTheme = currTheme === 'bootstrap' ? 'white' : currTheme;
var override = currTheme === 'white';
var buttonTextColor = override ? 'black' : 'white';
var themeColor = themeManager.themes[currTheme];
var themeFadeout = themeManager.utils.fadeoutColor(themeColor, 0.1);
var buttonStyle = 'style="font-weight: bold; color: ' + buttonTextColor + '; background-color: ' + themeColor + ';" bgcolor="' + themeColor + '"';
var headerStyle = 'style="background-color: ' + themeFadeout + ';" bgcolor="' + themeFadeout + '"';
function createButtonCell(caption) {
return '<td ' + buttonStyle + '><font color="' + buttonTextColor + '">' + caption + '</font></td>';
}
function createButtons(buttons, cellsCountBefore, cellsCountAfter, prefix) {
var i;
var str = prefix || '<tr>';
for (i = 0; i < cellsCountBefore; i++) {
str += '<td></td>';
}
str += buttons.reduce(function(tr, field) {
return (tr += createButtonCell(field.caption));
}, '');
for (i = 0; i < cellsCountAfter; i++) {
str += '<td></td>';
}
return str + '</tr>';
}
var cellsHorizontalCount = Math.max(config.dataFields.length + 1, pgridwidget.layout.pivotTable.width);
var dataInicioFilter = (pgridwidget.pgrid.config.dataInicio==null) ? '' :
'<tr><td><font color=\"#ccc\">Data Início</font></td>' + '<td ' + buttonStyle +
'><font color="' + buttonTextColor + '">' + pgridwidget.pgrid.config.dataInicio +
'</font></td>'+'</tr>';
var dataFimFilter = (pgridwidget.pgrid.config.dataFim==null) ? '' :
'<tr><td><font color=\"#ccc\">Data Fim</font></td>' + '<td ' + buttonStyle +
'><font color="' + buttonTextColor + '">' + pgridwidget.pgrid.config.dataFim +
'</font></td>'+'</tr>';
var comissaoFilter = (pgridwidget.pgrid.config.comissao==0) ? '' :
'<tr><td><font color=\"#ccc\">Comissão (R$)</font></td>' + '<td ' + buttonStyle +
'><font color="' + buttonTextColor + '">' + pgridwidget.pgrid.config.comissao +
'</font></td>'+'</tr>';
var dataFields = createButtons(config.dataFields,
0,
cellsHorizontalCount - config.dataFields.length,
'<tr><td><font color="#3a2c2c">Dados</font></td>'
);
var sep = '<tr><td style="height: 22px;" colspan="' + cellsHorizontalCount + '"></td></tr>';
var columnFields = createButtons(config.columnFields,
pgridwidget.layout.rowHeaders.width,
cellsHorizontalCount - (pgridwidget.layout.rowHeaders.width + config.columnFields.length)
);
var columnHeaders = (function() {
var str = '';
var j;
for (var i = 0; i < pgridwidget.columns.headers.length; i++) {
var currRow = pgridwidget.columns.headers[i];
var rowStr = '<tr>';
if (i < pgridwidget.columns.headers.length - 1) {
for (j = 0; j < pgridwidget.layout.rowHeaders.width; j++) {
rowStr += '<td></td>';
}
} else {
rowStr += config.rowFields.reduce(function(tr, field) {
return (tr += createButtonCell(field.caption));
}, '');
}
rowStr += currRow.reduce(function(tr, header) {
var value = header.type === uiheaders.HeaderType.DATA_HEADER ? header.value.caption : header.value;
return (tr += '<td ' + headerStyle + ' colspan="' + header.hspan(true) + '" rowspan="' + header.vspan(true) + '">' + value + '</td>');
}, '');
str += rowStr + '</tr>';
}
return str;
}());
var rowHeadersAndDataCells = (function() {
var str = '';
var j;
for (var i = 0; i < pgridwidget.rows.headers.length; i++) {
var currRow = pgridwidget.rows.headers[i];
var rowStr = '<tr>';
rowStr += currRow.reduce(function(tr, header) {
return (tr += '<td ' + headerStyle + ' colspan="' + header.hspan(true) + '" rowspan="' + header.vspan(true) + '">' + header.value + '</td>');
}, '');
var dataRow = pgridwidget.dataRows[i];
rowStr += dataRow.reduce(function(tr, dataCell, index) {
var formatFunc = config.dataFields[index = index % config.dataFields.length].formatFunc;
var value = dataCell.value == null ? '' : formatFunc ? formatFunc()(dataCell.value) : dataCell.value;
return (tr += '<td>' + value + '</td>');
}, '');
str += rowStr + '</tr>';
}
return str;
}());
function toBase64(str) {
return utils.btoa(unescape(encodeURIComponent(str)));
}
return uriHeader +
toBase64(docHeader +
'<table>' + dataInicioFilter + dataFimFilter + comissaoFilter + dataFields + sep + columnFields + columnHeaders + rowHeadersAndDataCells + '</table>' +
docFooter);
};
}
时要谨慎一点,它对数据类型进行操作。因此,如果您传递一个指向它的指针,它将返回指针变量的大小,而不是它指向的字符串的长度。
答案 2 :(得分:1)
在几个重要的方面,只有一些方法与sizeof
有关,你误解了你的代码实际上做了什么。
FILE *in_file;
in_file = fopen(filename, "r");
if (in_file == NULL)
{
printf("File does not exist\n");
return 1;
}
实际检查fopen
是否成功的荣誉;很多人在用C开始时忘记这样做。但是,fopen
可能失败的原因有很多;不存在的文件只是其中之一。每当I / O操作失败时,请务必打印strerror(errno)
,以便了解实际原因。此外,错误消息应发送到stderr
,而不是stdout
,并且应包括受影响文件的名称(如果有)。修正后的代码如下所示
if (in_file == NULL)
{
fprintf(stderr, "Error opening %s: %s\n", filename, strerror(errno));
return 1;
}
(如果文件已经存在,则需要在文件顶部添加string.h
和errno.h
的内容。)
int val_to_inspect = 0;
fscanf(in_file,"%x", &val_to_inspect);
此代码不从文件中读取字符串。它会跳过任何前导空格,然后从文件中读取一系列十六进制数字,一旦遇到非数字就停止,并立即将它们转换为存储在val_to_expect
中的机器号。使用包含1234abcd
的文件,它确实会从文件中读取8个字符,但是对于其他文件内容,它可能会读取更多或更少的字符。
(从技术上讲,使用%x
转换说明符,您应该使用 unsigned int,但大多数实现都可以让您使用signed int。)
(当你在C中练习更多时,你会发现scanf
已按指定进行破坏,并且很难使用,但现在不用担心。)
while (val_to_inspect != 0) {
printf("%x", val_to_inspect);
int length = sizeof val_to_inspect;
printf("%d", length);
}
您没有将sizeof
应用于字符串,而是将其应用于int
。您计算机上int
的大小为4 char
s,无论值是什么,都是。
此外,sizeof
应用于实际的C字符串(即指向NUL终止的字符序列的char *
变量)不计算长度字符串。它将告诉你字符串的指针的大小,它将是一个常量(通常是4或8,取决于计算机),与字符串的长度无关。要计算字符串的长度,请使用库函数strlen
(在string.h
中声明)。
您有时会看到聪明的代码将sizeof
应用于字符串文字,它会返回与其长度相关(但不等于!)的数字。为你练习:弄清楚那个数字是什么,为什么sizeof
为字符串文字做这个,而不是为一般的字符串做。 (提示:当sizeof s
被声明为s
时,s
将返回与char s[] = "string";
字符串长度相关的数字,但不是当它被声明为char *s = "string";
时。)
作为最后一点,无论你是否喜欢自己的开口大括号,在宏观方案中都没有关系,但选择一种风格并坚持整个文件< / em>的。不要在自己的行上放置一些if
个开口括号,而在if
行的末尾放置一些。{/ p>
答案 3 :(得分:0)
最好通过逐个字符地创建自己的计数器来查找"1234abcd"
的长度。
FILE *in_file;
char ch;
int length=0;
in_file = fopen("filename.txt", "r");
if (in_file == NULL)
{
printf("File does not exist\n");
return 1;
}
while (1) {
ch = fgetc(in_file);
printf("%c", ch);
if (ch == EOF)
break;
length++;
}
fclose(in_file);
printf ("\n%d",length);
答案 4 :(得分:0)
每个人,谢谢你的反馈。我意识到我在原帖中犯了很多错误,但是我只是从c ++切换到c,所以很多我以前用过的东西都不能用同样的方法。这一切都非常有用,有一个地方可以去。
答案 5 :(得分:0)
Len = sizeof(你的字符串)/ sizeof(char)-1 -1是eof字符null 如果你想从特定的开始索引得到任何长度,只需做Len-index