C++的开发问题

#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
   char a[]={};
   char b[]={};
   cout<<"*****欢迎使用凯撒密码加解密系统*****"<<endl;
   cout<<"请输入明文"<<endl;
   scanf("%s",&a);
   const int c=sizeof(a);
   for(int i=0;i<c-1;i++)
   {
       if(a[i]==' ')
       {
           b[i]=a[i];
       }
       else
       {
           b[i]=(a[i]+1);
       }
   }
   cout<<"密文为"<<b<<endl;
   return 0;
}

请问这段代码有什么问题吗 就是输入一段字符 输出加密后的字符
为啥密文都显示不出来。。

阅读 2.9k
1 个回答

假设你要实现的功能是用读入一个用户输出的字符串存储在a中,然后加密后存储在b中,并显示出来。

那么上面这一段代码有这么一些错误之处:

1,给a、b保留的空间不足
定义部分可以改为:
char a[1000], b[1000];

2,读取输入语句错误
C语言中使用数组名时,等同于数组首地址,也就是a = &(a[0])。
a已经是一个地址,scanf不用对a取地址。
读入语句应该改为
scanf("%s", a);

3,求字符串长度错误
求字符串的长度应该使用strlen函数。
int c = strlen(a);
另外求出字符串长度不用-1,这是off-by-1错误。

4,C风格字符串结束符错误
C风格字符串以'\0'结局,应该在修改b后将b结局置为'\0'。

为什么显示不出结果来?
原因是(1)和(3)。
sizeof对数组使用时是求出数组的长度。
虽然(2)错误地修改了a的值,但我估计这一sizeof在编译器已经进行,因此没有影响sizeof(a)的求值。
一开始定义的a[]数组中没有内容,所以后面的循环实际上没有执行。

另外,混用了c和c++风格。
c++中读入的时候可以考虑使用string类(至少一般的c++教材是这么说的)。

如果要一段正确的代码,大概应该是这样:

string a;
cin>>a;
string b = enc(a);
cout<<b<<endl;

或者用c风格写法
char a[1000], b[1000];
scanf("%s", a);
enc(b, a);
printf("%s\n", b);

enc函数请自己编写,记得求a长度用C语言的方法应该是strlen(a)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题