如果字符串中有整数,如何获取c中字符串的长度
我熟悉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_
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
的大小为4char
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);