如果在c中有一个整数,如何在c中获取字符串的长度

时间:2017-09-15 14:45:34

标签: c string sizeof

我熟悉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",只是为了澄清。

6 个答案:

答案 0 :(得分:4)

这里有几个问题:

sizeof运算符返回对象的大小。在这种情况下,它返回val_to_inspect的大小,即inthttp://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.herrno.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