#include <stdioh>
int main()
{
int i=0;
char string[50];
gets(string);
puts(string);
while(string[i] != '\0')
{
if(string[i]>='a'&&string[i]<='z')
{
string[i]=(string[i]+3-'a')%26+'a';
}
else if(string[i]>='A'&&string[i]<='Z')
{
string[i]=(string[i]+3-'A')%26+'A';
}
i++;
}
puts(string);
return 0;
}
#include<stdioh>
void secret(char s[]){
int i=0;
while(s[i]!='\0'){
if('0'<=s[i]&&s[i]<='9')
s[i]=9-(s[i]-'0')+'0';
else if('a'<=s[i]&&s[i]<='z')
s[i]=25-(s[i]-'a')+'a';
else if('A'<=s[i]&&s[i]<='Z')
s[i]=25-(s[i]-'A')+'A';
if('#'==s[++i]) s[i]='\0';
}
}
int main(){
char s[80];
printf("enter s:\n");
scanf("%s",s);
secret(s);
printf("%s\n",s);
}运行结果:
[willie@localhost zhidao]$ gcc yunsuanc -o yunsuano
[willie@localhost zhidao]$ /yunsuano
enter s:
osnbUEp39snS#
lhmyFVk60hmH加密解密的算法都没错,错的是解密程序里的文件 *** 作方法。
rewind(fp)没有必要。因为fp已经被close了。一般不推荐同时对一个文件又读又写,因为这样会导致很多缓冲区同步的问题
。比如:
fputc()和getc()之间,必须要调用fflush(fp);
即使这样,还是会有问题。比如回车,getc()可能会返回两个字符,\n和\a。但是用fputc()写入的时候,分别写入\n和\a会把第二行第一个字符覆盖掉。
正确的做法是:先把解密的数据保存到字符串
里,全部结束之后,一次性把解密完的字符串写到文件里去。
void main()
{
char ch,name[30];
char content[1000];
int n = 0;
FILE fp;
printf("name:\a");
gets(name);
fp = fopen(name,"r+");
if(fp==NULL)
{
printf("No file: %s!\n\a",name);
return;
}
ch = getc(fp);
while(ch!=EOF)
{
if((isalpha(ch))!=0)
{
if((ch >= 'a' && ch <= 'd') || (ch >= 'A' && ch <='D'))
ch = ch + 22;
else
ch = ch - 4;
}
content[n++] = ch;
ch = getc(fp);
//ch = getc(fp);
}
content[n] = 0;
rewind(fp);
fprintf(fp, "%s", content);
fclose(fp);
printf("%s ok\a\n",name);
printf("content: %s\n", content);
printf("\n");
}
楼主,你的问题在于没有对数组
r
初始化(而s的输出没有问题),这样输出的时候找不到结束符,所以就一直输出下去,因此出现了乱码。
提出两种修改方法,这两种方法都可以避免你的问题:
1、char
r[10000]={0};
后就可以了。这样你输入的字符串不管是多长,到时后面的都是结束符。
2、上面不对r进行初始化,而修改下面
for(i=0;s[i]!='\0';i++)
{
if((s[i]<='Z')&&(s[i]>='A'))
r[i]=s[i]+3;
else
if((s[i]<='z')&&(s[i]>='a'))
r[i]=s[i]-4;
else
r[i]=s[i];
}
r[i]='\0';
//在r的后面加上结束符就可以了
#include <stdioh>
#include <ctypeh>
char encrypt(char text) {
char c;
char p = text;
for (; text; ++text) {
c = text;
if (isdigit(c))
text = '0' + '9' - c;
else if (islower(c)) {
c = c + 3;
if (c > 'z')
c = c - 26;
text = c;
} else if (isupper(c)) {
c = c + 3;
if (c > 'Z')
c = c - 26;
text = c;
}
}
return p;
}
int main() {
char text[100];
printf("输入明文:");
scanf("%s", text);
printf("密文:%s\n", encrypt(text));
getchar();
}以上就是关于C语言
评论列表(0条)