#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;
}
请问这段代码有什么问题吗 就是输入一段字符 输出加密后的字符
为啥密文都显示不出来。。
假设你要实现的功能是用读入一个用户输出的字符串存储在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)