C语言条件编译程序问题

C语言条件编译,以下程序出错,不知道错在哪里:
出错信息:
第8行:error C2014: preprocessor command must start as first nonwhite space
第13行:fatal error C1020: unexpected #endif
程序:
#include<stdio.h>
#define CHANGE 1
int main()
{ char str[20],c;
int i=0;
gets(str);
while((c=str[i])!='\0')
{ #if CHANGE
if((c>='A'&&c<='Y')||(c>='a'&&c<='z'))
c=c+1;
else if((c=='Z')||(c=='z'))
c=c-25;
#endif
printf("%c",c);
i++;
}
return 0;
}

  一般情况下,源程序中所有的行都参加编译。但有时希望对其中一部分内容只在满足一定条件下才进行编译,即对一部分内容指定编译条件,这就是“条件编译”(conditional compile)。条件编译语句排版时,需考虑以下三种位置:
  1)条件编译语句块与函数定义体之间不存在相互嵌套(主要在(.h)文件中);
  2)条件编译语句块嵌套在函数体之外(主要在(.c)文件中);
  3)条件编译语句嵌套在函数体内 (主要在(.c)文件中)。条件编译指令将决定哪些代码被编译,而哪些是不被编译的。可根据表达式的值或某个特定宏是否被定义来确定编译条件。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-03-02
第8行:error C2014: preprocessor command must start as first nonwhite space
第13行:fatal error C1020: unexpected #endif

第8行,#if CHANGE 要独占一行,即去掉前面的{

第13行 其实报错的原因是,因为第8行没有识别到#if。

在第8行 { 与 #if CHANGE 之间加入回车即可。

同学 出了问题要看报错原因撒。。。追问

在看到您的回答前我也已经解决了。是这样解决的。但为什么要这样呢?您是从哪里知道这样的解决方法的?

追答

呵呵 你用词不用这么慎重 您...

我的回答里面说了,通过编译器给你报的错误原因撒,第8行:error C2014: preprocessor command must start as first nonwhite space,翻译成中文大致是说,预处理器命令必须以非空白开始(其实就是说必须写在行首),像这种规定其实有很多,比方说makefile里面就要求 命令必须以TAB键开始;在bash 脚本里面必须以#!打头等等。
多用了你就熟悉了。
顺便给你说下,最好不要用gets函数...读取单字符可以用getchar 读取一行字符串可以用getline
从文件读取可以fgets ...read fread...

本回答被提问者采纳
第2个回答  2012-08-09
if((c>='A'&&c<='Y')||(c>='a'&&c<='z'))
这里小写字母范围包含‘z’了,马虎了吧。哈哈。

#define CHANGE 1
#if CHANGE
#endif
上面的预处理使用的没有问题。
第3个回答  推荐于2017-12-15
#include<stdio.h>
#define CHANGE 1
int main()
{ char str[20],c;
int i=0;
gets(str);
while((c=str[i])!='\0')
{ //这两句是干么的,自己写头文件呀,不能放这里呀#if CHANGE
if((c>='A'&&c<='Y')||(c>='a'&&c<='z'))
c=c+1;
else if((c=='Z')||(c=='z'))
c=c-25;
//同理#endif
printf("%c",c);
i++;
}
return 0;
}本回答被网友采纳
第4个回答  2012-08-09
第8行去掉#,第13行改为else。