如何获得c中的字符串的长度,如果它有整数
我熟悉C中的sizeof
操作,但是当我将它用于字符串"1234abcd"
时,它只返回4
,我假设它是会计最后4个字符。 那么我怎么会得到这是一个字符串大小为8?如何获得c中的字符串的长度,如果它有整数
具体代码如下:
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"
,只是为了阐明。
TL; DR,得到一个字符串的长度,你需要使用strlen()
。
也就是说,在使用sizeof
时要谨慎一点,它对数据类型进行操作。所以,如果你传递一个指针,它会返回指针变量的大小,而不是它指向的字符串的长度。
是有几个问题在这里:
sizeof
运算符返回对象的大小。在这种情况下,它返回的尺寸为val_to_inspect
,这是一个int
。 http://en.cppreference.com/w/cpp/language/sizeof
fscanf
从流中读取并解释它。您只扫描一个整数(“%x”),而不是一个字符串。 http://en.cppreference.com/w/cpp/io/c/fscanf
最后,如果你实际上有一个零终止的字符串,要得到它的长度,你可以使用strlen()
。
更准确地说,要得到一个以null结尾的字符串的长度,不仅可以使用strlen ()',***应该这样做。应用于'char *'或'char'数组的'sizeof'运算符会计算出不同的结果(并且在这两种情况下有所不同)。 –
从来没有声称sizeof是在任何可能的工具工具:) – ssteinberg
不,我提到'sizeof'因为OP正在使用它。我的评论是关于你选择的措辞;我澄清了这一点。 –
在几个重要的方面,其中只有一些与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
的文件,它确实会从该文件读取八个字符,但对于其他文件内容,它可能会读取更多或更少的字符。
(从技术上说,你应该使用无符号 INT,但大多数实现将让你用一个符号整数脱身%x
转换说明。)
(当你用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字符串(即,一个char *
变量指向字符的NUL封端的序列)不不计算串的长度。它会将指针的大小告诉给字符串,该字符串将是一个常量(通常为4或8,取决于计算机),与字符串的长度无关。要计算字符串的长度,请使用库函数strlen
(在string.h
中声明)。
有时您会看到巧妙的代码将sizeof
应用于字符串文字,该函数的返回值与其长度有关(但不等于!)。为你锻炼:找出这个数字是什么,以及为什么sizeof
这样做是为了字符串文字,而不是为了一般的字符串。 (提示:sizeof s
将返回相关的s
字符串长度数字时s
被宣布为char s[] = "string";
,但不当它被宣布为char *s = "string";
。)
最后一点,它不会在这个问题上无论你是否喜欢你自己的系列中的开口花括号,但是选择一种风格并坚持贯穿整个文件。不要在if
行的末尾放置一些if
开口支架。
我会说:*您的计算机上的int的大小是4 **字节** ... * – chqrlie
@chqrlie _byte_的大小不一定与_ _char'_大小相同。 'sizeof'是以'char'单位定义的。 (是的,这是非常迂腐的,但我已经在这个网站上大吼大叫,因为这个区别,所以。) – zwol
恐怕你是不正确的。 C和C++中的“char”类型是定义中最小的可寻址单元,其大小为1.它恰好是一个字节。相反,字节不一定有8位,旧系统有9位字节,某些DSP处理器有16位甚至32位字节。我坚持使用* byte *这个词的原因是因为'char'类型附加了特定的语义,比如潜在的签名,当对对象的大小进行描述时,这是不相关的。 OTOH Java中的char类型是16位,在大多数系统上需要2个字节。 – chqrlie
最好是通过逐个字符地读取字符来创建自己的计数器来查找"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,所以很多我以前不能真正以同样的方式应用的东西。这非常有帮助,有一个地方可以去。
长度=的sizeof(你的字符串)/的sizeof(char)的-1 -1 是EOF字符空 如果你想获得任何来自特定begining指数长度只是做莱恩指数
'sizeof'会给你一个数据类型的大小。看看'strlen()'。 – babon
'int len1 = 0,len2 = 0; fscanf(in_file,“%n%x%n”,&len1,&val_to_inspect,&len2); int length = len2-len1;' – BLUEPIXY