2017-09-15 65 views
2

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

+4

'sizeof'会给你一个数据类型的大小。看看'strlen()'。 – babon

+1

'int len1 = 0,len2 = 0; fscanf(in_file,“%n%x%n”,&len1,&val_to_inspect,&len2); int length = len2-len1;' – BLUEPIXY

回答

2

TL; DR,得到一个字符串的长度,你需要使用strlen()

也就是说,在使用sizeof时要谨慎一点,它对数据类型进行操作。所以,如果你传递一个指针,它会返回指针变量的大小,而不是它指向的字符串的长度。

4

是有几个问题在这里:

sizeof运算符返回对象的大小。在这种情况下,它返回的尺寸为val_to_inspect,这是一个inthttp://en.cppreference.com/w/cpp/language/sizeof

fscanf从流中读取并解释它。您只扫描一个整数(“%x”),而不是一个字符串。 http://en.cppreference.com/w/cpp/io/c/fscanf

最后,如果你实际上有一个零终止的字符串,要得到它的长度,你可以使用strlen()

+0

更准确地说,要得到一个以null结尾的字符串的长度,不仅可以使用strlen ()',***应该这样做。应用于'char *'或'char'数组的'sizeof'运算符会计算出不同的结果(并且在这两种情况下有所不同)。 –

+0

从来没有声称sizeof是在任何可能的工具工具:) – ssteinberg

+0

不,我提到'sizeof'因为OP正在使用它。我的评论是关于你选择的措辞;我澄清了这一点。 –

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的文件,它确实会从该文件读取八个字符,但对于其他文件内容,它可能会读取更多或更少的字符。

(从技术上说,你应该使用无符号 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开口支架。

+0

我会说:*您的计算机上的int的大小是4 **字节** ... * – chqrlie

+0

@chqrlie _byte_的大小不一定与_ _char'_大小相同。 'sizeof'是以'char'单位定义的。 (是的,这是非常迂腐的,但我已经在这个网站上大吼大叫,因为这个区别,所以。) – zwol

+0

恐怕你是不正确的。 C和C++中的“char”类型是定义中最小的可寻址单元,其大小为1.它恰好是一个字节。相反,字节不一定有8位,旧系统有9位字节,某些DSP处理器有16位甚至32位字节。我坚持使用* byte *这个词的原因是因为'char'类型附加了特定的语义,比如潜在的签名,当对对象的大小进行描述时,这是不相关的。 OTOH Java中的char类型是16位,在大多数系统上需要2个字节。 – chqrlie

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); 
0

大家好,谢谢大家的反馈。我意识到我在原文中犯了很多错误,但是我只是从C++切换到c,所以很多我以前不能真正以同样的方式应用的东西。这非常有帮助,有一个地方可以去。

0

长度=的sizeof(你的字符串)/的sizeof(char)的-1 -1 是EOF字符空 如果你想获得任何来自特定begining指数长度只是做莱恩指数

相关问题