将 strlen() 与数组整数或浮点数一起使用 [重复]
Posted
技术标签:
【中文标题】将 strlen() 与数组整数或浮点数一起使用 [重复]【英文标题】:Using strlen() with Array Integers or Float [duplicate] 【发布时间】:2020-04-21 01:10:19 【问题描述】:有没有办法,我可以使用 strlen() 来查找数组的长度,而不是在循环中指定。 第一个代码:使用 x 这是 temps[4] 数组的大小。
#include <stdio.h>
#include <string.h>
int main()
float temps[4] = 72.5, 73.4, 74.7, 75.2;
int x;
printf("Local Temperatures\n");
for(x = 1; x < 4; x++)
printf("Station %d: %.1f\n",x,temps[x]);
我的第二个代码,不工作,但看看什么,我试图用 strlen() 来找到数组的大小。:
#include <stdio.h>
#include <string.h>
int main()
float temps[4] = 72.5, 73.4, 74.7, 75.2;
int x;
float size;
size = temps;
printf("Local Temperatures\n");
for(x = 1; x < strlen(size); x++)
printf("Station %d: %.1f\n",x,size[x]);
【问题讨论】:
strlen
用于字符串。为什么你认为它适用于任何其他数组类型?要获取数组元素的数量,请执行 sizeof temps / sizeof temps[0]
.
如果您启用所有编译器警告,您的编译器会输出什么?你需要这样做。您正在尝试做的事情尚不清楚,而且它不是正确的 C 代码。
1. strlen
仅适用于 char* 您不能将其用于数组。 2. temps 只能从 0 到 3 进行索引,数组越界访问发生在您的 sn-p
提示:float temps[] = ...;
优于 float temps[4] = ...;
【参考方案1】:
strlen
实际上是以下内容的优化版本:
size_t len = 0;
const char *p = s;
while (!*p)
++len;
++p;
您可以轻松适应。
size_t len = 0;
const float *p = s;
while (*p != 0.0)
++len;
++p;
当然,这意味着你需要一个标记值,就像你为字符串设置的一样。
float temps[] = 72.5, 73.4, 74.7, 75.2, 0.0 ;
虽然您可以使用除 0.0
之外的值作为标记值,但使用标记值可能并不理想,因此您可能真的不想采用与字符串相同的方法。
对于数组(相对于指针),您可以使用以下方法来确定数组中元素的数量:
sizeof(a)/sizeof(*a)
这意味着您可以使用以下方法来确定temps
中的元素数量:
sizeof(temps)/sizeof(*temps)
【讨论】:
【参考方案2】:简单的方法是通过sizeof(temps)/sizeof(temps[0])
获取数组的大小
类似的,
for(x = 0; x < sizeof(temps)/sizeof(temps[0]); x++)
printf("Station %d: %.1f\n",x,temps[x]);
注意:在您的 sn-p 数组中,访问是从 1 到 (size) 而不是 0 到 (size-1),这是越界访问。
【讨论】:
当你告诉人们使用sizeof x / sizeof *x
来获取数组的大小时,建议他们它只适用于数组,而不适用于指针,以避免学生经常犯的错误。
【参考方案3】:
简短回答:不。
strlen
需要一个char *
类型的参数,它指向字符串 的第一个字符,这是一个字符值序列,包括一个零值终止符时间>。 strlen
返回结束符前的字符数:
/**
* A naive implementation of strlen. Actual implementations
* are a little more clever.
*/
size_t strlen( const char *str )
size_t count = 0;
while( str[count] )
count++;
return count;
要记住的重要一点是strlen
返回字符串的长度,而不是包含字符串的数组的大小。如果你有类似的东西
char foo[1024] = “bar”;
strlen( foo );
返回 3。
如果您尝试将整数或浮点数组传递给strlen
,编译器会因为错误的参数类型而对您大喊大叫。您可以通过将参数强制转换为 char *
来解决此问题,但您仍然可能会得到错误的答案,不仅因为整数和浮点类型是多个 char
s 宽,而且还因为这样的值可能嵌入了零值字节。例如,整数值 16 表示为字节 0x00, 0x00, 0x00, 0x10
。如果这是整数数组的第一个元素,那么strlen
将在大端平台上返回 0,在小端平台上返回 1。
如果你定义了数组,那么你就知道它有多大。如果您正在编写一个接收数组参数的函数,那么您必须同时接收大小作为单独的参数,或者您必须依赖数组中存在的标记值。
【讨论】:
【参考方案4】:这样做是为了得到你的浮点数组的长度,
int main()
float ar[4] = 1.1,1.2,1.3,1.4;
float b;
printf("Array Size : %d\n",sizeof(ar)/sizeof(b));
return 0;
您将获得数组的元素总数,您可以在循环中进一步使用它来打印数组的元素。 注意:不要在指针的情况下使用 sizeof。
【讨论】:
当你告诉人们使用sizeof array / sizeof element
来获取数组的大小时,建议他们它只适用于数组,而不适用于指针,以避免学生经常犯的错误。
【参考方案5】:
strlen() 将“const char *”类型值作为参数。所以它不能与整数或浮点数组一起使用。
【讨论】:
以上是关于将 strlen() 与数组整数或浮点数一起使用 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
将具有 1.185 亿欧元或 6 万欧元等货币值的 pandas 列转换为整数或浮点数 [关闭]