|
藍森林 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 |
| |