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

如果字符串中有整数,如何获取c中字符串的长度,c,string,sizeof,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_

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

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


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

这里有几个问题:

sizeof
运算符返回对象的大小。在这种情况下,它将
val\u的大小返回给\u inspect
,这是一个
int

fscanf
读取流并对其进行解释。您只扫描整数(“%x”),而不是字符串。


最后,如果您实际上有一个以零结尾的字符串,那么为了获得它的长度,您可以在几个重要方面使用
strlen()

,其中只有一些与
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
的包含项添加到文件顶部,如果它们还不存在的话。)

此代码不从文件中读取字符串。它跳过任何前导空格,然后从文件中读取一系列十六进制数字,一旦遇到非数字就立即停止,并立即将其转换为存储在
val_to_expect
中的机器编号。对于包含
1234abcd
的文件,它确实会从文件中读取八个字符,但对于其他文件内容,它可能会读取更多或更少的字符

(从技术上讲,使用
%x
转换说明符时,您应该使用无符号int,但大多数实现都允许您使用有符号int。)

(当你更多地练习C语言时,你会发现,
scanf
按照规定是不可靠的,而且很难可靠地使用,但现在不要担心这一点。)

您没有将
sizeof
应用于字符串,而是将其应用于
int
。在您的计算机上,
int
的大小为4
char
s,无论值是多少,都是如此

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

您有时会看到聪明的代码将
sizeof
应用于字符串文本,该字符串文本返回与其长度相关(但不等于!)的数字。为您做的练习:找出该数字是多少,以及为什么
sizeof
对字符串文本而不是一般的字符串执行此操作。(提示:
sizeof s
将返回一个与
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(字符)-1 -1是eof字符null
如果您想从特定的起始索引中获取任何长度,只需执行Len index

sizeof
即可获得数据类型的大小。签出
strlen()
int len1=0,len2=0;fscanf(在文件“%n%x%n”中,&len1,&val\u-to\u-inspect,&len2);int length=len2-len1
更准确地说,要获得以null结尾的字符串的长度,不仅可以使用
strlen()
,还应该这样做。应用于
char*
char
数组的
sizeof
运算符计算的内容不同(并且在这两种情况下有所不同)。从未声称sizeof可能是作业的工具:)不,我提到
sizeof
,因为OP正在使用它。我的评论是关于你对措辞的选择;我已经澄清了这一点。您可以使用strlen,您可以将您的c字符串输入到std::string中。你可以做很多事情,这取决于它来自哪里以及你打算用它做什么。我想说:在你的计算机上,
int
的大小是4个字节…@chqrlie一个字节不一定和一个字节大小相同<
while (val_to_inspect != 0) {
    printf("%x", val_to_inspect);
    int length = sizeof val_to_inspect;
    printf("%d", length);
}
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);