啊哈磊_编程从这里起步

标题: 请问为什么编译不了? [打印本页]

作者: 忆中寻思    时间: 2014-4-20 16:52
标题: 请问为什么编译不了?
#include <stdio.h>
#include <stdlib.h>
#define MAXELS 14
int main()
{
        void remove(char [],char);
    char message[MAXELS]="HappyHolidays";
    char aph='H';
    int i;
    printf("%s",message);
    system("pause");
    return 0;
}


作者: rosynirvana    时间: 2014-4-20 16:52
写个供你参考的版本
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. void remove_char(char*, char);
  4. int main()
  5. {
  6.         
  7.         char message[]="HappyHolidays\n";
  8.         char delh='H';
  9.         int i;
  10.         
  11.         puts(message);
  12.         remove_char(message,delh);
  13.         puts(message);
  14.         system("pause");
  15.         return 0;
  16. }

  17. void remove_char(char *message,char delh)
  18. {
  19.         char temp[15];
  20.         int i, j;
  21.         for(i=0, j=0; message[i]; ++i)
  22.                         if(message[i] != delh)
  23.                                 temp[j++] = message[i];
  24.         temp[j] = '\0';
  25.         for(i=0; temp[i]; ++i)
  26.                         message[i] = temp[i];
  27.         message[i] = '\0';      
  28. }
复制代码

作者: 李掌柜    时间: 2014-4-20 17:18
你这段代码这几句好像是多余的吧?
  1. void remove(char [],char);
复制代码
  1. char aph='H';
复制代码
  1. int i;
复制代码


作者: rosynirvana    时间: 2014-4-20 17:59
好好看编译器给出的提示

你写了个声明void remove(char*, char);
但是stdio.h里面有个同名的函数remove,原型是int remove(const char*);
这两个声明冲突了

把那句函数声明注释掉或者删掉就可以编译了
作者: 愛情風華    时间: 2014-4-20 18:12
可以請問一下這句#define MAXELS 14  是何作用?{:soso_e132:}
作者: 李掌柜    时间: 2014-4-20 18:21
愛情風華 发表于 2014-4-20 18:12
可以請問一下這句#define MAXELS 14  是何作用?

这句等于
  1. char message[14]="HappyHolidays";
复制代码

的意思,
作者: ybw0014    时间: 2014-4-20 19:11
你这第一行什么意思,不懂
作者: rosynirvana    时间: 2014-4-20 21:44
愛情風華 发表于 2014-4-20 18:12
可以請問一下這句#define MAXELS 14  是何作用?

就是在编译“之前”,把代码里所有的MAXELS用14替换
作者: 忆中寻思    时间: 2014-4-20 22:15
李掌柜 发表于 2014-4-20 17:18
你这段代码这几句好像是多余的吧?

嗯,是多余的!
作者: 忆中寻思    时间: 2014-4-20 22:38
rosynirvana 发表于 2014-4-20 17:59
好好看编译器给出的提示

你写了个声明void remove(char*, char);

请问如何注释掉?删除不用有影响吗?
作者: rosynirvana    时间: 2014-4-20 22:46
忆中寻思 发表于 2014-4-20 22:38
请问如何注释掉?删除不用有影响吗?
  1. // void remove(char*, char);
复制代码

或者
  1. /* void remove(char*, char);  */
复制代码


编译器就会认为它是注释,是给程序员看的,就会直接跳过不处理了
不过这里是和标准库里的函数冲突,直接删掉就可以了

删掉不用是指什么?
作者: 忆中寻思    时间: 2014-4-20 22:55
不好意思,打错一个字,是删除不会对输出/输入有影响吗?
作者: rosynirvana    时间: 2014-4-20 22:59
忆中寻思 发表于 2014-4-20 22:55
不好意思,打错一个字,是删除不会对输出/输入有影响吗?

我说的是删除你写的 void remove(char[], char);
为啥会对输入输出有影响?
作者: 忆中寻思    时间: 2014-4-20 23:03
我这个是一个函数原型来的。怎么可以删去呢?
作者: rosynirvana    时间: 2014-4-20 23:08
忆中寻思 发表于 2014-4-20 23:03
我这个是一个函数原型来的。怎么可以删去呢?

你这段代码里又没有remove这个函数
如果其他地方有,那要改个名字,不能用remove这个名字

或者你把完整代码贴上来?
作者: 忆中寻思    时间: 2014-4-20 23:28
标题: 这个程序是用要求册除字符'H"
本帖最后由 rosynirvana 于 2014-4-20 23:32 编辑
rosynirvana 发表于 2014-4-20 23:08
你这段代码里又没有remove这个函数
如果其他地方有,那要改个名字,不能用remove这个名字

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAXELS 14
  4. int main()
  5. {
  6.         void remove(char [],char);
  7.         char message[]="HappyHolidays\n";
  8.         char delh='H';
  9.         printf("%s",message);
  10.         remove(message,delh);
  11.         int i;
  12.         for(i=0;i<MAXELS;i++)
  13.         {
  14.                 printf("%c",message[i]);
  15.         }
  16.         system("pause");
  17.         return 0;
  18. }
  19. void remove(char *message,char delh)
  20. {
  21.         char *a=message;
  22.         while(*message++)
  23.         {
  24.                 if(*message++==delh)
  25.                 ;
  26.                 else
  27.                 *a++=*message++;
  28.                
  29.                  
  30.                
  31.         }
  32. }
复制代码




作者: rosynirvana    时间: 2014-4-20 23:37
本帖最后由 rosynirvana 于 2014-4-20 23:39 编辑
忆中寻思 发表于 2014-4-20 23:28

如果只是要通过编译,那么把函数改个名就行
remove_char之类的
其他问题还有很多


作者: rosynirvana    时间: 2014-4-20 23:44
本帖最后由 rosynirvana 于 2014-4-20 23:51 编辑
忆中寻思 发表于 2014-4-20 23:28

首先,函数声明写在某个函数之类是蹩脚的写法
所有函数声明都应该写在全局作用域中

MAXELS宏没必要,整个代码就这一个长度,而且这个MAXELS宏和message数组长度还不一样(message长度是15)

如果严格遵照C90标准,那么函数内的声明必须写在statement之前,不能在后面写int i;
用printf逐个输出字符数组的每个字符是很低效的做法,输出字符串应该直接用puts

另外remove_char的实现不正确

作者: 忆中寻思    时间: 2014-4-21 17:16
rosynirvana 发表于 2014-4-20 23:44
首先,函数声明写在某个函数之类是蹩脚的写法
所有函数声明都应该写在全局作用域中

message长度为什么不是14?
作者: rosynirvana    时间: 2014-4-21 17:28
忆中寻思 发表于 2014-4-21 17:16
message长度为什么不是14?

你忘了最后的休止字符'\0'了吧
作者: 忆中寻思    时间: 2014-4-21 17:37
rosynirvana 发表于 2014-4-21 17:28
你忘了最后的休止字符'\0'了吧

好像是啊!好了,谢谢你!




欢迎光临 啊哈磊_编程从这里起步 (https://bbs.codeaha.com/) Powered by Discuz! X3.2