C++不能正确读取字符串

#include<iostream>
using namespace std;
void main()
{
cout<<"-------------欢迎使用Vigenere加密----------------------"<<endl;
cout<<"1.使用加密:"<<endl;
cout<<"2.使用解密:"<<endl;
int choice;
cin>>choice;
switch(choice)
{
case 1:
char pre_string[100];
char key_string[20];
int i,j;
cout<<"使用加密,请输入原文:"<<endl;
for(i=0;pre_string[i-1]!='\n';i++)
{
cin>>pre_string[i];
}
cout<<"请输入密钥:"<<endl;
for(j=0;key_string[j-1]!='\n';j++)
{
cin>>key_string[j];
}
char word;
for(i=0,j=0;pre_string[i]!='\0';i++,j++)
{
if(key_string[j]!='\0')
{
if(pre_string[i]+key_string[j]-97>91)
word=pre_string[i]+key_string[j]-97-26;
else word=pre_string[i]+key_string[j]-97;
cout<<word;
}
else
{
j=j-6;
if(pre_string[i]+key_string[j]-97>91)
word=pre_string[i]+key_string[j]-97-26;
else word=pre_string[i]+key_string[j]-97;
cout<<word;
}
}

case 2:;
}
}

读取不对,怎样修改使得输入正确?能进行加密操作
题目:读取用户输入的字符串,vigenere加密,类似于凯撒加密,用户自己输入密钥,加密后输出相应的密文。

以上回答都没能根本解决问题,你的程序主要出现在cin语句,也就是说你对C++的输入流不够熟悉,至于具体的内容,你可以去本人的文库里下载文章《C++的IO(输入输出)专题》看了后你就会明白怎样使用cin了,下面简介一下。

使用cin进行输入:cin是类istream的对象。对于cin输入,它将跳过空白(空格,换行符和制表符)直到遇到非空白字符,cin将读取从非空白字符到与目标类型不匹配的第一个字符之间的全部内容。比如有cin<<a;其中a是int,则输入123 z x时,则只把123赋给变量a,而后面的z x则留在输入流中,下一次输入时就将从这里开始读取,比如再有cin<<b;其中b是char型,则字符z将赋给变量b,这里不会提示输入变量b的值,这不是我们所预期的,而字符x又将留在输入流中,在这里不会读取z前面的空白字符,正如前面所说cin输入将跳过空白直到遇到非空白字符起才开始读取。再比如cin<<a;其中a是int,则当输入3 2 1时,则只有数字3被赋给变量a,因为在数字3后面的空格是与类型int不匹配的类型,在这里就结束输入。如果再输入时输入3.3这样的数字的话,则同样的道理,在程序中点符号对于整型来说是非匹配类型,所以只有数字3被输入给变量a,则后面的字符被留在输入流中。

C++中怎样检查输入时的错误:在输入时我们可能希望在用户输入错误的情况下给用户发送一个消息以便重新输入,这种实现的机制就取决于C++的输入错误检查。
a、在C++中有三个位用来设置错误的状态信息,iso::eofbit当文件到达末尾时则设置该位。ios::badbit当流被破坏时设置该位,这是不可恢复的,比如文件读取错误。ios::failbit如果输入操作未能读取到预期的字符或输出操作没有写入预期的字符则设置该位,这是可恢复的。这三个状态标志设置了不同类型的输入错误。
b、可以使用流类继承的函成员数来测试这三个对象的标志,注意调用这些成员函数都要使用类的对象来调用,比如使用cin对象。
1、函数bad()如果badbit被设置,则反回true,
2、函数eof()如果eofbit被设置则反回true,
3、函数fail()如果badbit或failbit被设置则反回true。
4、函数good()如果没有设置任何状态位则反回true。一旦设置了标志,该标志就会一直保持下去,除非对它重新进行了设置。
5、函数clear()用于重设三个标志位,不带参数的clear()函数将清除三个状态位即都设置为0。调用clear(eofbit);将使eofbit位设为1,而其他位设为0。而函数setstate(eofbit);同样将eofbit位设为1,但不影响其他位,如果其他位被设置则依然被设置。
c、为什么需要重设流状态呢?因为一旦流状态的其中某一位被设置后,则流将对后面的输入或输出关闭,直到流状态被清除。比如cin>>a;其中a是int型变量,如果这时输入一个字符d,则会出现设置流状态failbit位,这可以通过调用good()函数来测试,这时对后面的输入将会关闭,也就是说如果cin>>a;后面还有一句cin>>b;则语句cin>>b将不会执行。
d、如果希望程序在流状态位被设置后能够读取后面的输入,则必须将流状态重置为良好。这可以使用clear()方法来实现。比如cin>>a; cin.clear(); cin>>b;其中变量a是整型。这时如果输入一个字符d语句cin>>a将使程序设置failbit位,语句cin.clear()将状态位failbit位清除,接着执行语句cin>>b,这时会发现程序cin>>b;没有提示输入,这是为什么呢?原因就在于虽然使用clear()函数重置了流状态,但是不匹配的输入仍然留在输入队列中,下一次输入就将从这里读起,而不会提示用户输入内容,而是从输入流中直接提取,也就是说字符d会直接赋给变量b;如果变量b是字符型的话则接收他,并把字符d赋给b,这里不会提示输入变量b的值,这不是我们所预期的。如果变量b是整型变量的话,则cin>>b又将是错误的。怎样能在第一次输入错误后让系统提示用户为以后的输入语句输入内容呢?方法就是使用一个函数来一直读取输入流中的字符直到达到空白为止,这可以使用isspace()函数和ignore()函数来实现,下面将具体介绍。
e、isspace()函数:该函数读取并丢弃一个字符,isspace()函数可以直接调用,比如isspace(cin.get())。比如cin>>a;cin.clear(); isspace(cin.get()); cin>>b;这时如果首先输入字符d则变量a不接收他并将字符d保留在输入流中,并设置failbit位,然后调用clear()函数清除状态位failbit,然后使用isspace()函数读取字符d并丢弃掉它,这时输入流中没有什么内容,所以就会再次出现提示为变量b输入内容的提示。注意isspace(cin.get())只能读取并丢弃一个字符,当输入def时就会出现错误,这时字符d赋给变量a,变量a不接收字符d将其留在输入流中,然后clear()清除failbit位,isspace()丢弃字符d,最后字符e赋给变量b,因为变量b是整型变量,所以又将出错,而且整个过程没有为我们提示输入变量b的内容,而是程序直接从输入流中提取内容,这不是我们所预期的。要使其再次提示对变量b进行输入的提示,需要读取并丢弃更多的字符,这可以通过使用ignore()成员函数来实现。
f、ignore()成员函数:该函数可以读取并丢弃多个字符,该函数需要流类的对象来调用比如cin.ignore(),其函数原型为ignore(int =1;int =EOF),即函数接收两个参数,第一个参数指定要读入并丢弃多少个字符,而二个参数是分界符,比如ignore(244,’b’)表示读取并丢弃接下来的244个字符,或者在遇到字符b时结束。不带参数的ignore()则表示读取并丢弃一个字符,或遇到文件末尾。

综上所述,你所编写程序的修改地方为:
1、在语句,cin>>choice;后添加cin.clear(); cin.ignore();
2、把语句cin>>pre_string[i]; 改写为cin.get(pre_string[i]);注意,不能在该语句后添加cin.ignore()
3、把语句cin>>key_string[j];改写为cin.get(key_string[j]);
4、改写完成,其他需要怎么修改的地方,相信你看了以上文章应该明白怎么改写了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-03-07
if(key_string[j]!='\0')
你这样创建的字符数组是不会有结束符的,这个条件语句总为真
你要么使用string,要么就自己加段代码,等用户输入完成后,在后面加上一个结束符
第2个回答  2010-03-07
#include<iostream>
using namespace std;
void main()
{
cout<<"-------------欢迎使用Vigenere加密----------------------"<<endl;
cout<<"1.使用加密:"<<endl;
cout<<"2.使用解密:"<<endl;
int choice;
cin>>choice;
switch(choice)
{
case 1:
char pre_string[100];
char key_string[20];
int i,j;
cout<<"使用加密,请输入原文以'#'结束: "<<endl;
for(i=0;pre_string[i - 1]!='#';i++)
{
cin>>pre_string[i];
}
pre_string[i - 1] = '\0';

cout<<"请输入密钥以'#'结束: "<<endl;
for(j=0;key_string[j - 1]!='#';j++)
{
cin>>key_string[j];
}
key_string[j - 1] = '\0';

char word;
for(i=0,j=0;pre_string[i]!='\0';i++,j++)
{
if(key_string[j]!='\0')
{
if(pre_string[i]+key_string[j]-97>91)
word=pre_string[i]+key_string[j]-97-26;
else word=pre_string[i]+key_string[j]-97;
cout<<word;
}
else
{
j=j-6;
if(pre_string[i]+key_string[j]-97>91)
word=pre_string[i]+key_string[j]-97-26;
else word=pre_string[i]+key_string[j]-97;
cout<<word;
}
}

case 2:;
}
}
好像还有问题,你自己看下吧...
第3个回答  2010-03-07
- -!!! 你还不如把题目发出来,帮你写个。
你这个又没注释看看,都不知道你那要干嘛。
刚脆点把要求发出把!
相似回答