C语言小问题求大神帮帮忙

字符加密问题。
#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。

  1. A return statement in main has the effect of leaving the main function (destroying any objects with automatic storage duration) and calling exit with the return value as the argument. If control reaches the end of main without encountering a return statement, the effect is that of executing return 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()语句,吸收掉回车字符。