找回密码
 FreeOZ用户注册
查看: 4455|回复: 38
打印 上一主题 下一主题

[软件技巧] C,VB语言问题~~~

[复制链接]
跳转到指定楼层
1#
发表于 9-8-2010 21:03:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x
比如:

scanf("%d",aa);获取数字,
那么字符为什么要加fflush(stdin)呢?
字符串怎么取法?
还有多少种办法,牛牛内来介绍一下。

比如说我现在要用do while来做个菜单,那么WHILE里的参数如果用字符该怎么取得输入呢??

[ 本帖最后由 8戒 于 28-8-2010 22:55 编辑 ]
回复  

使用道具 举报

2#
发表于 9-8-2010 22:23:13 | 只看该作者
不懂Windows上C的人路过帮顶
回复  

使用道具 举报

3#
发表于 9-8-2010 22:27:34 | 只看该作者
iostream<<也是可以的,但是我从来不用。
scanf("%s",str);
回复  

使用道具 举报

4#
发表于 9-8-2010 22:43:09 | 只看该作者
标准C里面有 iostream<< ?
这都进化得和C++差不多了么...
回复  

使用道具 举报

5#
发表于 9-8-2010 23:11:40 | 只看该作者
scanf()
getc()
fread()
read()
gets()
fgets()
fgetc()
getchar()

随便想了一下写的,没有什么顺序。


原帖由 8戒 于 9-8-2010 20:03 发表
比如:

scanf("%d",aa);获取数字,
那么字符为什么要加fflush(stdin)呢?
字符串怎么取法?
还有多少种办法,牛牛内来介绍一下。

比如说我现在要用do while来做个菜单,那么WHILE里的参数如果用字符该怎么取 ...

评分

参与人数 1威望 +30 收起 理由
ubuntuhk + 30 基本齐了,你太有才了。

查看全部评分

回复  

使用道具 举报

6#
发表于 9-8-2010 23:15:20 | 只看该作者
fflush(stdin)很少用,参见这里:
http://zhidao.baidu.com/question/19308630
这种用法很少见,因为通过stdin输入时,即当采用getchar,gets,scanf等函数读入时,系统会自动在每个操作之后清理缓冲区,所以再使用fflush(stdin)没什么意义。

倒是fflush(stdout)更常用一些。
回复  

使用道具 举报

7#
发表于 9-8-2010 23:25:36 | 只看该作者
我一般就用fgets()和read(),前者用于buffered input,后者用于non-buffered input,
一般来说,后者用得多一些,buffer的控制还是信自己多一点。

原帖由 ubuntuhk 于 9-8-2010 22:15 发表
fflush(stdin)很少用,参见这里:
http://zhidao.baidu.com/question/19308630

评分

参与人数 1威望 +30 收起 理由
coredump + 30 我很赞同!

查看全部评分

回复  

使用道具 举报

8#
发表于 9-8-2010 23:53:10 | 只看该作者
所上所说我全部赞同
回复  

使用道具 举报

9#
发表于 10-8-2010 11:16:23 | 只看该作者
原帖由 key 于 9-8-2010 22:11 发表
scanf()
getc()
fread()
read()
gets()
fgets()
fgetc()
getchar()

随便想了一下写的,没有什么顺序。


gets is evil[size=13.8889px]
回复  

使用道具 举报

10#
发表于 10-8-2010 15:16:15 | 只看该作者

回复 #7 key 的帖子

read()啊,我真是几乎没用过,除了用于串口编程或控制一些硬件数据读取我见过之外,其它地方我也很少见到用(我所接触的编程范围)

不过fread我倒是经常用,fgets能不用还是尽量别用,一不小心就coredump了
回复  

使用道具 举报

11#
发表于 10-8-2010 15:18:00 | 只看该作者
原帖由 ubuntuhk 于 10-8-2010 14:16 发表
read()啊,我真是几乎没用过,除了用于串口编程或控制一些硬件数据读取我见过之外,其它地方我也很少见到用(我所接触的编程范围)

不过fread我倒是经常用,fgets能不用还是尽量别用,一不小心就coredum ...
特别是在ubuntu下会这样[size=13.8889px]
回复  

使用道具 举报

12#
发表于 10-8-2010 15:23:51 | 只看该作者
read/write open/close 比 fread/fwrite fopen/fclose更底层,基本就是system call的简单封装了,没有buffer, 适合key同学这样的buffer控

没有特殊原因,还是用f系列的函数更简单一些,不过read/write代码更通用,不必仅限于文件了,所有IO都包含了。
回复  

使用道具 举报

13#
发表于 10-8-2010 19:17:14 | 只看该作者
原帖由 ritz 于 9-8-2010 21:43 发表
标准C里面有 iostream

I was wrong, I read it c++.
回复  

使用道具 举报

14#
 楼主| 发表于 23-8-2010 23:17:02 | 只看该作者
#include "dos.h"
#include "stdlib.h"
#include "stdio.h"
#define PORT 0
void SendFile(char *fname); /* 发送文件*/
void Send(int s); /*发送一个字节*/
void SendFileName(char *fname); /*发送文件名*/
void ReceiveFile(); /*接收文件*/
void GetFileName(char *f); /*接收文件名*/
void InitPort(int port,unsigned char para); /*初始化端口*/
void SendPort(int port,char c); /*端口发送*/
int ReadPort(int port); /*读端口字节*/
int CheckState(int port); /*检查端口状态*/
int Receive(int port,int *G); /*接收一个字节*/
main(int argc,char *argv[])
{
         if(argc<2)
         {
                printf("Please input R(receive) or S(sent) parametre:");
                exit(1);
         }
         InitPort(PORT,231);
         if(*argv[1]==''''S'''') /*检查选择的有效性*/
                  SendFile(argv[2]);
         else if(*argv[1]==''''R'''')
                  ReceiveFile();
         else
         {
                  printf("Error parament.Please input again.");
                  exit(1);
         }
}

void SendFile(char *fname)
{
      FILE *fp;
      int ch,s;
      if((fp=fopen(fname,"rb"))==NULL)
      {
             printf("Can''''t open the file.\n");
             exit(1);
      }
      SendFileName(fname);
      do
      {
            ch=(int)getc(fp);
            if(ferror(fp))
            {
            printf("Error reading file.\n");
            break;
            }
      s=ch%16; /*取文件中一个字节的低4位*/
      Send(s);
      s=ch/16; /*取文件中一个字节的高4位*/
      Send(s);
      }
      while(!feof(fp));
      s=46; /*发送文件结束信息*/
      Send(s);
      Send(s);
      fclose(fp);
}
      
void Send(s)
int s;
{
    int G;
    SendPort(PORT,s);
    G=ReadPort(PORT); /*等待握手信号*/
    if(s!=G)
            s=s+16;
    do
    {
         SendPort(PORT,s);
         G=ReadPort(PORT);/*等待握手信号*/
    }
    while(s!=G);
}

void SendFileName(fname)
char *fname;
{
     int s,ch;
     printf("Now transmit the file.Please wait...");
     while(*fname)
     {
           ch=(int)fname++;
           s=ch%16; /*取文件名中一个字节的低4位*/
           Send(s);
           s=ch/16;
           Send(s); /*取文件名中一个字节的低4位*/
     }
     s=32; /*发送文件名结束标志*/
     Send(s);
     Send(s);
}

void ReceiveFile()
{
     FILE *fp;
     char ch;
     int G1,G2,G3;
     char fname[15];
     GetFileName(fname);
     printf("Receiving file %s.\n",fname);
     remove(fname);
     if((fp=fopen(fname,"wb"))==NULL)
     {
            printf("Can''''t open output file.\n");
            exit(1);
     }
/*循环为检测每次接受的数据是否为新数据,如果不是,*/
/*则用此次接收的数据覆盖上次接收的数据*/
     G1=ReadPort(PORT);
     G2=Receive(PORT,&G1);
     do
     {
            G3=Receive(PORT,&G2);
            ch=(char)(G1%16+G2*16);/*恢复分开的数据,组合高4位和低4位*/
            putc(ch,fp);
            if(ferror(fp))
            {
                    printf("\nError writing file.");
                    exit(1);
            }
            G2=Receive(PORT,&G3);
            G1=G3;
     }
            while(G1/16!=48);
            printf("\nTransmit finished.");
            fclose(fp);
}

int Receive(port,G)
int port,*G;
{
           int GM;
           SendPort(port,*G);
           GM=ReadPort(port);
           if(GM/16==0)
           return GM;
           else if(GM/16==1)
           {
                   do
                   {
                   *G=GM;
                   SendPort(port,GM);
                   GM=ReadPort(port);
                   }
                   while(GM/16==1);
           }
           return GM;
}
     
void GetFileName(char *f)
{
                int G1,G2,G3;
                char ch;
                G1=ReadPort(PORT);
                G2=ReadPort(PORT);
                do
                {
                                G3=Receive(PORT,&G3);
                                ch=(char)(G1%16+G2/16);
                                *f=ch;
                                *f++;
                                G2=Receive(PORT,&G3);
                                G1=G3;
                }while(G1/16!=32);
                printf("File name transmit finished.\n");
}


void InitPort(port,para)
int port;
unsigned char para;
{
                union REGS reg;
                reg.x.dx=port;
                reg.h.ah=0;
                reg.h.al=para;
                int86(0x14,?,?);
}


void SendPort(port,c)
int port;
char c;
{
                union REGS reg;
                reg.x.dx=port;
                reg.h.al=c;
                reg.h.ah=1;
                int86(0x14,?,?);
                if(reg.h.ah&128)
                        {
                                        printf("\nSend mistakes!");
                                        exit(1);
                        }
}


int ReadPort(port)
int port;
{
                union REGS reg;
                while(!(CheckState(port)&256))
                {
                                if(kbhit())
                                                        {                  /*如端口长期无数据可人为终止等待*/
                                                                                printf("Press any key to exit.");
                                                                                getch();
                                                                                exit(1);
                                                        }
                }
reg.x.dx=port;
reg.h.ah=2;
int86(0x14,?,?);
if(reg.h.ah&128)
                {
                                printf("\nRead mistake!");
                                exit(1);
                }
return reg.h.al;
}

int CheckState(port)
int port;
{
                union REGS reg;
                reg.x.dx=port;
                reg.h.ah=3;
                int86(0x14,?,?);
                return reg.x.ax;
}
回复  

使用道具 举报

15#
 楼主| 发表于 23-8-2010 23:19:19 | 只看该作者
这段程序有问题,无法通过编译,请帮我看一下是什么问题?
23:25 D:\My documents\aaa.c empty character constant
D:\My documents\aaa.c In function `main':
23 D:\My documents\aaa.c syntax error before '\x0'

[ 本帖最后由 8戒 于 23-8-2010 22:20 编辑 ]
回复  

使用道具 举报

16#
发表于 24-8-2010 04:45:45 | 只看该作者

回复 #15 8戒 的帖子

我看了一下,貌似这里有两行语法有错:
         if(*argv[1]==''''S'''') /*检查选择的有效性*/
                  SendFile(argv[2]);
         else if(*argv[1]==''''R'''')


改成这样试试:

         if(argv[1][0]=='S') /*检查选择的有效性*/
                  SendFile(argv[2]);
         else if(argv[1][0]=='R')


还有这行:
   printf("Can''''t open the file.\n");


改成这样试试:
   printf("Can\'t open the file.\n");


别的没仔细看。

评分

参与人数 2威望 +60 收起 理由
coredump + 50 谢谢分享!
8戒 + 10 谢谢指点,我试试

查看全部评分

回复  

使用道具 举报

17#
发表于 24-8-2010 14:23:28 | 只看该作者
int86(0x14,?,?);   //这句也不对,调用中断? 问号是什么。
------------------
int ReadPort(port)
int port;
---------------
这样的函数声明方式是很原始的K&R C风格,C语言初期的风格,应该
int ReadPort(int port) 这样,你是看的那本古董C编程的书?
回复  

使用道具 举报

18#
 楼主| 发表于 24-8-2010 15:29:52 | 只看该作者
呵呵,网上找来的代码,想研究一下,结果发现都是没办法用的。
回复  

使用道具 举报

19#
发表于 24-8-2010 15:33:42 | 只看该作者
原帖由 8戒 于 24-8-2010 14:29 发表
呵呵,网上找来的代码,想研究一下,结果发现都是没办法用的。

不能这么烟酒啊,这得猴年马月才能撞出眉目啊。拿一本小书看看先,C语言的语法,结构都很简单的
回复  

使用道具 举报

20#
 楼主| 发表于 24-8-2010 15:44:23 | 只看该作者
回老丐,已经看过了。非常简单,但是弄到程序上就觉得好难懂,呵呵~~。我们老师昨天还说我学得快,一点就通,说下次要给我更难的题目才行,可是自己学怎么就这么难呢?

我的目标不高,要能写通讯(RS232,OPC),要能把数据按自己的要求写进文件或弄进数据库。

[ 本帖最后由 8戒 于 24-8-2010 14:46 编辑 ]
回复  

使用道具 举报

21#
发表于 24-8-2010 16:44:01 | 只看该作者
原帖由 8戒 于 24-8-2010 14:44 发表
回老丐,已经看过了。非常简单,但是弄到程序上就觉得好难懂,呵呵~~。我们老师昨天还说我学得快,一点就通,说下次要给我更难的题目才行,可是自己学怎么就这么难呢?

我的目标不高,要能写通讯(RS232,OPC), ...
说明学得不扎实
字符串  “”,[size=13.8889px]字符''你都搞错了。
还有C语言一定要一开始就弄明白指针是怎么回事
,内存的分配和释放,堆内存和栈内存。

不过一点基础都没有能学到这么多,也的确很快了,而且2孩子的爸爸了,不容易,不容易。
回复  

使用道具 举报

22#
 楼主| 发表于 24-8-2010 22:29:22 | 只看该作者
问一下 malloc这个怎么用法?我怎么都没法,在网上的例子在自己机器上都没有成功过,是不是格式有问题呢?
回复  

使用道具 举报

23#
 楼主| 发表于 24-8-2010 22:33:16 | 只看该作者
原帖由 coredump 于 24-8-2010 15:44 发表
说明学得不扎实
字符串  “”,字符''你都搞错了。
还有C语言一定要一开始就弄明白指针是怎么回事
,内存的分配和释放,堆内存和栈内存。

不过一点基础都没有能学到这么多,也的确很快了,而且2孩子的爸爸了, ...


指针好像我搞明白了,*是定义和操作符,&是用来取地址的。比如说
int i,*p;
i=1;
p=&i;
这里的指针指向是是i的地址。要取p的值用*p
我说的对不对?


在网上看到说指针必须先定义,并初始化,介绍用这个命令:
int *ptr = malloc( sizeof(*ptr) );
可是我怎么用都不行。

[ 本帖最后由 8戒 于 24-8-2010 21:34 编辑 ]
回复  

使用道具 举报

24#
发表于 24-8-2010 22:59:45 | 只看该作者
原帖由 8戒 于 24-8-2010 21:33 发表


指针好像我搞明白了,*是定义和操作符,&是用来取地址的。比如说
int i,*p;
i=1;
p=&i;
这里的指针指向是是i的地址。要取p的值用*p
我说的对不对?


在网上看到说指针必须先定义,并初始化,介绍用这个 ...


最后那个肯定不行,指针的初始化里面用了还没定义好的指针,相当于要让鸡蛋孵出来的鸡去孵自己这个蛋。
回复  

使用道具 举报

25#
发表于 25-8-2010 00:21:22 | 只看该作者
原帖由 四香油饼 于 24-8-2010 21:59 发表


最后那个肯定不行,指针的初始化里面用了还没定义好的指针,相当于要让鸡蛋孵出来的鸡去孵自己这个蛋。

油饼没学好,人家8戒是对的[size=14.1667px]
回复  

使用道具 举报

26#
 楼主| 发表于 25-8-2010 00:32:06 | 只看该作者
谢谢油饼,这个我现在明白了。
回复  

使用道具 举报

27#
发表于 25-8-2010 00:46:03 | 只看该作者
原帖由 8戒 于 24-8-2010 21:33 发表

[size=14.1667px]int *ptr = malloc( sizeof(*ptr) ); ...
[size=14.1667px]int *ptr = malloc( sizeof(int) );
回复  

使用道具 举报

28#
发表于 25-8-2010 00:55:15 | 只看该作者
原帖由 coredump 于 24-8-2010 23:21 发表

油饼没学好,人家8戒是对的



欧。好吧。赋值是在定义之后才执行的。

不过8戒看得这是什么书啊? 现实中有人这么写程序么?
回复  

使用道具 举报

29#
 楼主| 发表于 25-8-2010 00:57:59 | 只看该作者
回复  

使用道具 举报

30#
 楼主| 发表于 25-8-2010 01:00:36 | 只看该作者
我也就是看点入门的东西,就想能实现串口及OPC通讯就差不多了,最多再弄个DB连接。不过好像用VB来实现会更简单一点。我现在已经能看懂WINCC的C函数了,这一点对我来说用途很大
接下来就学VB和DB了。

[ 本帖最后由 8戒 于 25-8-2010 00:03 编辑 ]
回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+11, 14-3-2025 15:23 , Processed in 0.035603 second(s), 47 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表