在C中找到字符串长度的问题

时间:2011-06-26 08:44:28

标签: c string

这是代码

#include<stdio.h>
#include<conio.h>
#include<string.h>
void main()
{
  clrscr();
  char a[20],rev[20];
  printf("enter the string");
  scanf("%s",a);
  int len=strlen(a);
  for(int i=0;i<len;i++)
  {
    rev[i]+=a[len-i-1];
  }
  printf("%d \t  \n string is \t %s",len,rev);
  getch();
}

当我们给它一个没有空格的字符串时它正常工作:

  

输入:欢迎
  LEN:7
  输出:emoclew

当我们给它一个带空格的字符串时:

  

输入:欢迎来到这个世界   LEN:7
  输出:我的其他一些ascii字符   到目前为止还没见过。和   “len”再次只有7个

当我更改以下声明时:

  

scanf(“%s”,a)得到(a);

我明白了:

  

输入:欢迎来到这个世界   LEN:21个
  输出:不同的东西。不是   字符串的反转...

在这种情况下,“len”是正确的,但输出错误。

真正发生了什么?上面的代码有什么问题?

4 个答案:

答案 0 :(得分:5)

scanf不会读取整行。相反它会读到第一个空格......你需要getline

另外,我注意到你的长度超过19的东西,但你分配了20个字符的空间。增加或者得到UB

答案 1 :(得分:3)

除了其他人所说的内容之外,rev无法保证初始化为NUL字符,因此您的rev[i]+=a[len-i-1];行最终可能会产生垃圾。

答案 2 :(得分:2)

使用以下内容:

的scanf( “%[^ \吨\ n]的”,字符串);

答案 3 :(得分:1)

评论:

  1. 正如Armen Tsirunyan所写,你可能想要getline
  2. 你只有一个大小为20的字符数组 - 所以在缓冲区溢出时会传递一个更大的字符串(这会使你的程序非常不安全 - 如果你想了解更多关于缓冲区溢出攻击的话,谷歌会这样做) - 这就是为什么你应该确保你从未读过超过字符数组的大小......