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

1 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();
}
Run Code Online (Sandbox Code Playgroud)

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

输入:welcome
len:7
输出:emoclew

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

输入:欢迎来到这个世界
len:7
输出:到目前为止我还没有见过的其他一些ascii字符.并且"len"仅为7

当我更改以下声明时:

scanf("%s",a)得到(a);

我明白了:

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

在这种情况下,"len"是正确的,但输出是错误的.

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

Arm*_*yan 5

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

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

  • 如果使用扫描集转换(`%19 [^ \n]`)而不是`%s`,`scanf`可以读取整行.`getline`不是标准C库的一部分.对于可移植代码,扫描集转换或`fgets`是合理的. (3认同)