将 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 * 来解决此问题,但您仍然可能会得到错误的答案,不仅因为整数和浮点类型是多个 chars 宽,而且还因为这样的值可能嵌入了零值字节。例如,整数值 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 列转换为整数或浮点数 [关闭]

Haskell:读取一个数字(整数或浮点数)

可以采用整数或浮点数或双精度数或任何其他可转换为浮点数的 C++ 函数

android中TextView能直接显示整数或浮点数吗?

ruby 转换由浮点分隔的逗号分隔的数字整数或浮点数

正则表达式从逗号分隔列表中删除连续重复(整数和/或浮点数)