藍森林首頁 | 返回主頁 | 本站地圖 | 站內搜索 | 聯繫信箱 |
 您目前的位置:首頁 > 自由軟件 > 技術交流 > 應用編程


    

藍森林 http://www.lslnet.com 2006年6月6日 10:18


c程序的神奇問題,高高手請進

在下面,while循環中,兩個變量的值reg_nu,reg_srv最終會變成一個值,這是怎麼回事;

[code]
/***** SYSTEM INCLUDES *****/
#include <stdio.h>;
#include <string.h>;
#include <time.h>;
#define OK 1
#define ERROR 0
/***** USER INCLUDES *****/
/***** GLOBAL VARIABLE DEFINITION *****/
const char* LICENSE_HEAD="BCDE"; //the macro storing the register number
const char* REGISTER_HEAD="BECS";//the macro difine the number of register service
typedef struct maindatas_struct{
char* my_mac_address; //The Mac address of this macthine
char* my_reg_number;  // the register number readed form license file
char* reg_services; //the number of register service
time_t install_time; //the time of the soft be installed
time_t this_time; //Now time of the soft is running
time_t used_time; //the time that has been elascaped
}maindatas;
/*read the register numbera from the licese file*/
int read_reg_number(maindatas* dif_maindatas);
main (int argc, char* argv[]){
maindatas m_data,*m_pt;
m_pt=&m_data;
printf("the register number is :%s\n",m_data.my_reg_number);
printf("the register services is :%s\n",m_data.reg_services);
//new_maindatas=(maindatas*)malloc(sizeof(maindatas));
int result=OK;
result=read_reg_number(m_pt);
if (result==OK){
printf("the register number is :%s\n",m_data.my_reg_number);
printf("the register services is :%s\n",m_data.reg_services);
//printf("the mac address is :%s\n",m_data.my_mac_address);
}
else
printf("there is something wrong\n");
}


/*read the register number ,the number of register services from the licese file*/
int read_reg_number(maindatas* dif_maindatas){
    char input_buffer[1024]={0};
        char *temp_buffer=NULL,*reg_nu=NULL,*reg_srv=NULL;
        char* license_file="license";
        FILE* myfp;
        myfp=fopen("license","r");
        if(myfp==NULL){
            fprintf(stderr, "Cannot open config file [%s]\n",license_file);
                return ERROR;
                }
        while(fgets(input_buffer,(int)(sizeof(input_buffer)-1),myfp)){
        if(input_buffer==NULL){
                    continue;
                    }
            if(input_buffer[0]=='#' || input_buffer[0]=='\x0' || input_buffer[0]=='\n' || input_buffer[0]=='\r'){
            continue;
            }
        if(strstr(input_buffer,LICENSE_HEAD)==input_buffer){
            temp_buffer=strtok(input_buffer,"=");
                        temp_buffer=strtok(NULL,"\x0");
                        if (temp_buffer) reg_nu=temp_buffer;
                   }
            if (strstr(input_buffer,REGISTER_HEAD)==input_buffer){
            temp_buffer=strtok(input_buffer,"=");
            temp_buffer=strtok(NULL,"\x0");
                    if (temp_buffer) reg_srv=temp_buffer;
                   }
     }       
    fclose(myfp);
    dif_maindatas->;my_reg_number=reg_nu;
    dif_maindatas->;reg_services=reg_srv;
    if (dif_maindatas->;reg_services==NULL ||dif_maindatas->;my_reg_number==NULL)return ERROR;
          else return OK;             
}
[/code]

c程序的神奇問題,高高手請進

const char* LICENSE_HEAD="BCDE";
const char* REGISTER_HEAD="BECS";

license 的內容
#this is a test
BCDE=wwwwwwww
BECS=eeeeeeee

c程序的神奇問題,高高手請進

用code重新貼一下代碼吧,看得眼花


比如
[code]
發表於: 2004-02-09 14:02    發表主題: 附:變量值   

--------------------------------------------------------------------------------

const char* LICENSE_HEAD="BCDE";
const char* REGISTER_HEAD="BECS";  

[/code]

c程序的神奇問題,高高手請進

在循環體中reg_nu 首先被付給一個值比如「wwwwww",但是最後付給reg_srv值(如」eeeeee「)的時候,reg_nu 的值會被改為reg_srv的值,都是''eeeeee",不知道為什麼

c程序的神奇問題,高高手請進

你文件的格式是什麼?

c程序的神奇問題,高高手請進

一般的文本格式

c程序的神奇問題,高高手請進

你把
[code]
if(strstr(input_buffer,LICENSE_HEAD)==input_buffer){
            temp_buffer=strtok(input_buffer,"=");
         temp_buffer=strtok(NULL,"\x0");
         if (temp_buffer) reg_nu=temp_buffer;
} [/code]
改成
[code]
if(strstr(input_buffer,LICENSE_HEAD)==input_buffer){
            temp_buffer=strtok(input_buffer,"=");
         temp_buffer=strtok(NULL,"\x0");
         if (temp_buffer) reg_nu=temp_buffer;
         continue;
} [/code]
試試。

c程序的神奇問題,高高手請進

:em06: 老大,不行阿,我調了一天了

c程序的神奇問題,高高手請進

樓主犯的是C語言的基礎錯誤,你應該找本基礎教材,看一下關於數組和指針的部分,或者是字符串的部分,你就會知道,你的任何一個字符數組都沒有分配內存,對於字符串的拷貝也僅僅是指針的賦值.

c程序的神奇問題,高高手請進

你把這些
[code]
if(input_buffer==NULL){
          continue;
          }
       if(input_buffer[0]=='#' || input_buffer[0]=='\x0' || input_buffer[0]=='\n' || input_buffer[0]=='\r'){
            continue;
            }
[/code]
去掉。
你的代碼有很多地方讓人迷惑。

c程序的神奇問題,高高手請進

:em14: 不會巴,老大,你能結合我得例子講講嗎?

c程序的神奇問題,高高手請進

你在while中已經判斷了fgets的返回值,
為什麼緊接著你又判斷input_buffer的值是否為空?

c程序的神奇問題,高高手請進

[code]
[b]/*跳過文件中的空白行*/[/b]
if(input_buffer==NULL){
          continue;
          }
[b]/*跳過文件中以」#「開頭的註釋文件*/[/b]
       if(input_buffer[0]=='#' || input_buffer[0]=='\x0' || input_buffer[0]=='\n' || input_buffer[0]=='\r'){
            continue;
            }
[/code]

c程序的神奇問題,高高手請進

strtok的問題,每次調用都修改input_buffer指針,把input_buffer內容備份一下,

c程序的神奇問題,高高手請進

我寫了一個簡單的測試代碼,你看看怎麼回事吧。
你的代碼我看的暈。
[code]
#include <stdio.h>;
#include <string.h>;

int main(int argc, char *argv[])
{
        FILE *fp;
        char input_buffer[1024]={0};
        char *temp_buffer=NULL,*reg_nu=NULL,*reg_srv=NULL;

        fp = fopen("test3.txt","r");
        if (NULL == fp) {
                printf("open file error\n");
                exit(-1);
        }
        while (fgets(input_buffer, 1024, fp)) {
                if (strstr(input_buffer,"BCDE") == input_buffer) {
            temp_buffer = strtok(input_buffer,"=");
                 temp_buffer = strtok(NULL,"\x0");
                 if (temp_buffer) {
                         reg_nu=temp_buffer;
                         printf("reg_nu = %s", reg_nu);
                 }
         }
         if (strstr(input_buffer,"BECS") == input_buffer) {
            temp_buffer = strtok(input_buffer,"=");
            temp_buffer = strtok(NULL,"\x0");
                  if (temp_buffer) {
                          reg_srv=temp_buffer;
                          printf("reg_srv = %s", reg_srv);
                  }
         }
     }
        fclose(fp);
        return 0;

}
[/code]
文本格式就是你貼出來的,
輸出結果為:
[code]
reg_nu = wwwwwwww
reg_srv = eeeeeeee
[/code]

c程序的神奇問題,高高手請進

感謝lenovo,但是我在循環體之外,引用兩個變量時,值都變成一樣的了,經過變量跟蹤,reg_nu的值在第一次循環之後,第二次循環之前就被改成"eeeeeeeee"了
[code]
#include <stdio.h>;
#include <string.h>;

int main(int argc, char *argv[])
{
   FILE *fp;
   char input_buffer[1024]={0};
   char *temp_buffer=NULL,*reg_nu=NULL,*reg_srv=NULL;

   fp = fopen("license","r");
   if (NULL == fp) {
      printf("open file error\n");
      exit(-1);
   }
   while (fgets(input_buffer, 1024, fp)) {
      if (strstr(input_buffer,"BCDE") == input_buffer) {
            temp_buffer = strtok(input_buffer,"=");
            temp_buffer = strtok(NULL,"\x0");
            if (temp_buffer) {
               reg_nu=temp_buffer;
               printf("reg_nu = %s", reg_nu);
            }
         }
         if (strstr(input_buffer,"BECS") == input_buffer) {
            temp_buffer = strtok(input_buffer,"=");
            temp_buffer = strtok(NULL,"\x0");
             if (temp_buffer) {
                reg_srv=temp_buffer;
                printf("reg_srv = %s", reg_srv);
             }
         }
     }
   fclose(fp);
  [color=red] printf("reg_nu = %s", reg_nu);
printf("reg_srv = %s", reg_srv); [/color]   return 0;
  
}
[/code]
結果是:
[code]
reg_nu=wwwwwwww
reg_srv=eeeeeeee
reg_nu=eeeeeee
reg_srv=eeeeeeee
[/code]

c程序的神奇問題,高高手請進

你直接把temp_buffer的值賦予dif_maindatas->;my_reg_number
或dif_maindatas->;reg_services。
你那兩個指針變量定義的有問題。

c程序的神奇問題,高高手請進

多謝,各位,問題已解決,用strdup



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 藍森林網站 版權所有。 E-mail : webmaster@lslnet.com