【问题标题】:Using strlen() with Array Integers or Float [duplicate]将 strlen() 与数组整数或浮点数一起使用 [重复]
【发布时间】: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] = ...;

标签: c


【解决方案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 *”类型值作为参数。所以它不能与整数或浮点数组一起使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-30
        • 2013-10-02
        • 1970-01-01
        • 1970-01-01
        • 2016-04-20
        • 1970-01-01
        • 2018-07-25
        • 1970-01-01
        相关资源
        最近更新 更多