[英]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.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
, 无论值是多少都是如此。
此外, 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.