繁体   English   中英

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

[英]How to get the length of a string in c, if it has integers in it

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

这里有几个问题:

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()

TL; DR ,要获取字符串的长度 ,需要使用strlen()

也就是说,在使用sizeof要小心谨慎,它会对数据类型进行操作。 因此,如果您将指针传递给它,它将返回指针变量的大小,而不是它指向的字符串的长度。

在几个重要的方面,只有一些与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无论值是多少都是如此。

此外, sizeof应用于实际C字符串(即,一个char *变量指向字符的NUL封端的序列) 计算串的长度。 它会告诉你指向字符串的指针的大小,它将是一个常量(通常是4或8,取决于计算机),与字符串的长度无关。 要计算字符串的长度,请使用库函数strlen (在string.h声明)。

您有时会看到聪明的代码将sizeof应用于字符串文字 ,它确实返回与其长度相关的数字(但不等于!)。 为你练习:找出这个数字是什么,以及为什么sizeof为字符串文字做这个,而不是为一般的字符串做。 (提示:当s被声明为char s[] = "string";sizeof s将返回与s的字符串长度相关的数字,但是当它被声明为char *s = "string";则不返回 char *s = "string"; 。)

最后要注意的是,无论你是否喜欢自己的开口大括号,在整个方案中都无关紧要,但在整个文件中选择一种风格并坚持下去 if在自己的线上打开支架而在if线的末端打开其他支架,请不要放置一些。

最好通过逐个字符来创建自己的计数器来查找"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);

大家好,谢谢你的反馈。 我意识到我在原帖中犯了很多错误,但是我只是从c ++切换到c,所以很多我以前习惯的东西都不能用同样的方法。 这一切都非常有用,有一个地方可以去。

Len = sizeof(你的字符串)/ sizeof(char)-1 -1是eof字符null如果你想从特定的开始索引得到任何长度,那就做Len-index

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM