#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.我的代码出了什么问题。
答案 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;
}