在C中查找不带递归的字符串长度

时间:2013-12-03 11:10:30

标签: c string string-length

#include<stdio.h>
#include<conio.h>
void main()
{
    int str1[25];
    int i=0;
    printf("Enter a string\n");
    gets(str1);
    while(str1[i]!='\0')
    {
        i++;
    }
    printf("String Length %d",i);
    getch();
    return 0;
}

我的字符串长度总是为33.我的代码出了什么问题。

6 个答案:

答案 0 :(得分:3)

这是因为,您已将数组声明为类型int

int str1[25]; 

^^^-----------Change it to `char`

答案 1 :(得分:1)

您没有显示输入的示例,但一般情况下我会猜测由于gets()的危险而导致缓冲区溢出。该函数已弃用,这意味着永远不会在新编写的代码中使用。

改为使用fgets()

if(fgets(str1, sizeof str1, stdin) != NULL)
{
  /* your code here */
}

另外,当然你的整个循环只是strlen(),但你知道吗,对吧?

编辑:Gaah,完全错过了误报,当然你的字符串应该是char str1[25];而不是int

答案 2 :(得分:1)

所以,很多答案已经告诉你使用char str1[25];代替int str1[25],但没有人解释原因。所以这里:

char的长度为一个字节(按照C标准的定义)。但int使用更多字节(多少取决于体系结构和编译器;我们假设这里有4)。因此,如果访问char数组的索引2,则在内存偏移量2处获得1个字节,但如果访问int数组的索引2,则在内存偏移量8处获得4个字节。

当你调用gets时(应该避免它,因为它是无界的,因此可能会溢出你的数组),一个字符串会被复制到str1的地址。该字符串实际上是char的数组。因此,对字符串进行成像将是123加上终止空字符。内存看起来像:

Adress:    0    1    2    3
Content:  0x31 0x32 0x33 0x00

当您阅读str1[0]时,您一次得到4个字节,因此str1[0]不会返回0x31,您将获得0x00333231(little-endian)或0x31323300(big endian)。

访问str1[1]已超出字符串。

现在,为什么你的字符串长度为33?这实际上是随机的,你很幸运,程序没有崩溃。从str1的起始地址开始,您将获取int值,直到最终连续获得4个0字节。在你的记忆中,有一些随机的垃圾,幸运的是你在阅读33 * 4 = 132字节后会遇到4个0字节。

所以在这里你已经可以看到边界检查非常重要:你的数组应该包含25个字符。但gets可能已经超出了这个范围(解决方案:改为使用fgets)。然后你无边界地扫描,因此也可以访问超出你的数组的内存,并可能最终运行到不存在的内存区域(这会使程序崩溃)。解决方案:进行边界检查,例如:

// "sizeof(str1)" only works correctly on real arrays here,
// not on "char *" or something!
int l;
for (l = 0; l < sizeof(str1); ++l) {
    if (str1[l] == '\0') {
      // End of string
      break;
    }
}

if (l == sizeof(str1)) {
  // Did not find a null byte in array!
} else {
   // l contains valid string length.
}

答案 3 :(得分:0)

我建议您对代码进行某些更改。

1)conio.h

    This is not a header that is in use. So avoid using it. 

2)得到

    gets is also not recommended by anyone. So avoid using it. Use fgets() instead

3)int str1 [25]  如果你想存储一个字符串,它应该是

     char str1[25]        

答案 4 :(得分:0)

问题出在字符串声明int str1[25]中。它必须是char而不是int

char str1[25]

答案 5 :(得分:0)

void main() //"void" should be "int"
{
    int str1[25]; //"int" should be "char"
    int i=0;
    printf("Enter a string\n");
    gets(str1);
    while(str1[i]!='\0')
    {
        i++;
    }
    printf("String Length %d",i);
    getch();
    return 0;
}