字符加密问题。
#include"stdio.h"
#define N 100
int main()
{
char k,a[N],
int n,i,j=1;
while(j)
{
printf("请输入要加密的单词有几个字母:");
scanf("%d",&n);
printf("请输入要加密的英文单词:");
for(i=0;i<n;i++)
{
scanf("%c",&a[i]);
a[i]=a[i]+4;
}
printf("加密后的英文单词为:");
for(i=0;i<n;i++)
printf("%c",a[i]);
printf("\n");
//scanf("%c",&k);
}
return 0;
}
我的程序问题出在哪里?
一:就是字符加密出错,class加密后应该是gpeww。我的结果头个字符变成了,最后 一个不见了。怎么回事??
二:还有while循环的最后一句吸收空格回车符的,我理解的还是有点模糊。
就是没有那一句的话,我输完class后按回车建,就出现图一情况,我想说的是第 二次次循环,两句文字中间不是有个输入语句,怎么就直接被忽略了呢。
三:第二个图就是while循环最后一句没有注释掉的。 来个大神给我讲讲,感激不尽
顺便弱弱问一句,怎么现在用int main() {....不用returned 0;}也行
全部都是scanf()语句带来的错误
在用scanf()语句输入字符按下回车键之后,回车键没有处理。
代码中a[0]不是'c',而是回车符。因为你在输入单词字母个数之后按下了回车,系统把回车符赋给了a[0],所以字符串a应该是“\nclas”。
程序运行过程中多余的字符如果不处理是不会消失的,scanf函数回车后产生的回车字符也是不会消失的只会在下一句scanf语句的时候把回车字符赋值给相应变量。
解决方法:在scanf函数后加上getchar()语句,吸收掉回车字符。
如果main没有return,有些编译期默认会在main函数的末尾没写return语句.但最好养成习惯。
C++标准规定:main函数可以省略返回语句,等效于返回0。
——ISO C++03 3.6.1 Main function p44/72
——ISO C++98 3.6.1 Main function p43/69
注意:
1. main函数的返回类型是int, 不是void或者其他类型。
2. 该规则仅仅对main函数适用。
3. 对其他函数,如果省略返回值, 将得到一个警告。
4. 应该避免3的情况。
我们知道main()函数的返回值类型是int型的,而程序最后的 return 0; 正与之遥相呼应,0就是main()函数的返回值。那么这个0返回到那里呢?返回给操作系统,表示程序正常退出。因为return语句通常写在程序的最后,不管返回什么值,只要到达这一步,说明程序已经运行完毕。而return的作用不仅在于返回一个值,还在于结束函数。
现在我们来做一个小试验(注意:本人的系统是Windows XP, 编译环境是TC)来观察main()函数的返回值。编写如下代码并编译运行:
//a.c
#include "stdio.h"
int main(void)
{
printf("I love you.");
return 0;
}
将这个文件保存为a.c,编译运行后会生成一个a.exe文件。现在打开命令提示符,在命令行里运行刚才编译好的可执行文件,然后输入 echo %ERRORLEVEL% ,回车,就可以看到程序返回 一个0 。如果把 return 0; 改为 return 99; ,那么很显然,再次执行上述步骤以后你可以看到程序返回99。要是你这样写 return 99.99; 那还是返回99,因为99.99被传给操作系统之前,被强制类型转换成整数类型了。
现在,我们把a.c改回原来的代码,然后再编写另一个程序b.c:
//b.c
#include "stdio.h"
int main(void)
{
printf("
I’m too.");
return 0;
}
编译运行后打开命令提示符,在命令行里输入a&&b 回车,这样你就可以看到《人鬼情未了》里面经典的爱情对白:
I love you.
I’m too.
&& 的含义是:如果 && 前面的程序正常退出,则继续执行 && 后面的程序,否则不执行。所以,要是把a.c里面的 return 0; 删除或者改为 return 99; ,那么你只能看到 I love you. 。也就是说,程序b.c就不执行了。现在,大家该明白 return 0; 的作用了吧。
scanf("%c",&n);定义的n是整数,%c就该是%d,不知道是不是你打错,另外main默认结束return 0;但为了养成好习惯(所有的函数都应返回一个对应的值)还是写上
for循环中n改为n+1或者改为i<=n否则只执行4次(第五次判定为假停止执行,你只看到四个加密字母)。另外你的while是个死循环,判定条件值为非零整数默认为真,一直执行。
简单来说, 你把
for (int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
改成
scanf("%s", a)
C语言是一种不安全的语言, 尤其使用旧有的标准库时, 对使用者要求还是蛮高的, 必须正确使用才能达到效果。
如果你使用VS,那么默认情况下编译器都回给出警告。
http://blog.csdn.net/luxuejuncarl/article/details/1576513
看看这篇文章, 方方面面都讲到了。 把 scanf("%c", &a[i]) 改成 scanf(" %c", &a[i]), 连我也没想到。
一个自负数组最后一位肯定是'\0'空字符,而你输入第五个字符后,第六个回车键没有处理,也就是数组里没有地方存'\0',于是就溢出了。处理方法应如3所说那样。
全部都是scanf()语句带来的错误
在用scanf()语句输入字符按下回车键之后,回车键没有处理。
代码中a[0]不是'c',而是回车符。因为你在输入单词字母个数之后按下了回车,系统把回车符赋给了a[0],所以字符串a应该是“\nclas”。
程序运行过程中多余的字符如果不处理是不会消失的,scanf函数回车后产生的回车字符也是不会消失的只会在下一句scanf语句的时候把回车字符赋值给相应变量。
解决方法:在scanf函数后加上getchar()语句,吸收掉回车字符。