ページ 1 / 1
Axe
Posted: 2010年12月17日(金) 13:48
by コンパイルは通るのに実行できません
コード:
char* URLEncode(char *str)
{
const unsigned char buf[] = "0123456789ABCDEF";
static unsigned char *out_buf;
int i;
while(*str != '\0')
{
i = 0;
if((*str >= '0' && *str <= '9') || (*str >= 'A' && *str <= 'Z') || (*str >= 'a' && *str <= 'z') || *str == '@' || *str == '*' || *str == '-' || *str == '.' || *str == '_')
{
i = 0;
}
else
{
i = 1;
}
if(i = 1)
{
*out_buf++ = '%';
*out_buf++ = buf[*str >> 4];
*out_buf++ = buf[*str & 0x0F];
}
else
{
*out_buf++ = *str;
}
str++;
}
*out_buf = '\0';
return out_buf;
}
コンパイルが通るってことは正常ってことぢゃないのですか?
実行ファイルが作成されて実行すると処理が停止してエラーになります。
なぜでしょうか?
Re: Axe
Posted: 2010年12月17日(金) 14:02
by パコネコ
プログラムはこれだけですか?
(mainとかは?)
あと名前と題名間違えてません?
=====
ついでに
これはミスですか?
if(i = 1)
Re: Axe
Posted: 2010年12月17日(金) 14:03
by みけCAT
*out_bufを初期化していないようですが、大丈夫ですか?
if(i = 1)
とあるのは
if(i == 1)
の間違いではないのですか?
return out_buf;
では、最後のnull文字のポインタが返りますが、仕様ですか?
Re: Axe
Posted: 2010年12月17日(金) 14:04
by 沖 滉均
名前と件名が逆のようですが間違えられたのでしょう…
また、環境等が書かれていませんので書いてある情報だけで答えさせていただきます。
上記のコードはこれで全てなのでしょうか?
main関数がないためコンパイルが通らないと思います
また、必ずしもコンパイルが通れば全て正常に動くという保障はありません。
動かないコードでもコンパイルが通ってしまう場合もあります。
Posted: 2010年12月17日(金) 14:07
by Axe
メインはこんな感じです。
コード:
int main()
{
char *buf;
char in[10240];
printf("文字列 : ");
scanf("%s",&in);
buf = URLEncode(in);
printf("%s",buf);
getch();
}
Re: Axe
Posted: 2010年12月17日(金) 14:10
by みけCAT
とりあえず上で指摘したポイントを直してみました。
全角文字を入力すると文字化けしたので、それも直しておきました。
コード:
void URLEncode(char* out_ptr,char *str)
{
const unsigned char buf[] = "0123456789ABCDEF";
unsigned char *out_buf;
int i;
out_buf=out_ptr;
while(*str != '\0')
{
i = 0;
if((*str >= '0' && *str <= '9') || (*str >= 'A' && *str <= 'Z') || (*str >= 'a' && *str <= 'z') || *str == '@' || *str == '*' || *str == '-' || *str == '.' || *str == '_')
{
i = 0;
}
else
{
i = 1;
}
if(i == 1)
{
*out_buf++ = '%';
*out_buf++ = buf[(unsigned char)*str >> 4];
*out_buf++ = buf[(unsigned char)*str & 0x0F];
}
else
{
*out_buf++ = *str;
}
str++;
}
*out_buf = '\0';
}
Re: Axe
Posted: 2010年12月17日(金) 14:11
by みけCAT
これを使ったプログラムです。
コード:
#include <stdio.h>
#include <string.h>
void URLEncode(char* out_ptr,char *str)
{
const unsigned char buf[] = "0123456789ABCDEF";
unsigned char *out_buf;
int i;
out_buf=out_ptr;
while(*str != '\0')
{
i = 0;
if((*str >= '0' && *str <= '9') || (*str >= 'A' && *str <= 'Z') || (*str >= 'a' && *str <= 'z') || *str == '@' || *str == '*' || *str == '-' || *str == '.' || *str == '_')
{
i = 0;
}
else
{
i = 1;
}
if(i == 1)
{
*out_buf++ = '%';
*out_buf++ = buf[(unsigned char)*str >> 4];
*out_buf++ = buf[(unsigned char)*str & 0x0F];
}
else
{
*out_buf++ = *str;
}
str++;
}
*out_buf = '\0';
}
int main(void) {
char in[300];
char out[3000];
fgets(in,sizeof(in),stdin);
*strstr(in,"\n")=0;
URLEncode(out,in);
printf("%s\n",out);
return 0;
}
Re: Axe
Posted: 2010年12月17日(金) 14:13
by みけCAT
Axe さんが書きました:scanf("%s",&in);
これは間違っています。
苦しんで覚えるC言語(苦C)などで勉強してください。
Re: Axe
Posted: 2010年12月17日(金) 14:18
by Axe
やっぱり
void URLEncode(char* out_ptr,char *str)
こういう形になりますか・・・
私もこの形では作れたのですがreturnを使って
buf = URLEncode(in);
というように取得したかったんですが・・・
できますかね?
Re: Axe
Posted: 2010年12月17日(金) 14:21
by みけCAT
コード:
char* URLEncode(char *str)
{
const unsigned char buf[] = "0123456789ABCDEF";
static unsigned char out_buf[10000];
int pos;
int i;
pos=0;
while(*str != '\0')
{
i = 0;
if((*str >= '0' && *str <= '9') || (*str >= 'A' && *str <= 'Z') || (*str >= 'a' && *str <= 'z') || *str == '@' || *str == '*' || *str == '-' || *str == '.' || *str == '_')
{
i = 0;
}
else
{
i = 1;
}
if(i == 1)
{
out_buf[pos++] = '%';
out_buf[pos++] = buf[(unsigned char)*str >> 4];
out_buf[pos++] = buf[(unsigned char)*str & 0x0F];
}
else
{
out_buf[pos++] = *str;
}
str++;
}
out_buf[pos] = '\0';
return out_buf;
}
ちゃんとバッファを確保しましょう。
Re: Axe
Posted: 2010年12月18日(土) 09:13
by みけCAT
バッファは動的確保の方がいいと思います。
前のプログラムはマルチスレッドに対応していないかもしれません。
動的確保したらちゃんと解放しましょう。
どちらも無駄は大したことはありません。
メモリを無駄にするバージョン(必ず入力の3倍のメモリを確保します。)
コード:
char* URLEncode(char *str)
{
const unsigned char buf[] = "0123456789ABCDEF";
unsigned char* out_buf;
int pos;
int i;
pos=0;
out_buf=calloc(sizeof(char),strlen(str)*3+1);
while(*str != '\0')
{
i = 0;
if((*str >= '0' && *str <= '9') || (*str >= 'A' && *str <= 'Z') || (*str >= 'a' && *str <= 'z') || *str == '@' || *str == '*' || *str == '-' || *str == '.' || *str == '_')
{
i = 0;
}
else
{
i = 1;
}
if(i == 1)
{
out_buf[pos++] = '%';
out_buf[pos++] = buf[(unsigned char)*str >> 4];
out_buf[pos++] = buf[(unsigned char)*str & 0x0F];
}
else
{
out_buf[pos++] = *str;
}
str++;
}
out_buf[pos] = '\0';
return out_buf;
}
時間を無駄にするバージョン(約2倍の時間がかかります。)
コード:
char* URLEncode(char *str)
{
const unsigned char buf[] = "0123456789ABCDEF";
unsigned char* out_buf;
char* strbak;
int pos;
int i;
strbak=str;
pos=0;
while(*str != '\0')
{
if((*str >= '0' && *str <= '9') || (*str >= 'A' && *str <= 'Z') || (*str >= 'a' && *str <= 'z') || *str == '@' || *str == '*' || *str == '-' || *str == '.' || *str == '_')
{
pos++;
}
else
{
pos+=3;
}
str++;
}
out_buf=calloc(sizeof(char),pos+1);
str=strbak;
pos=0;
while(*str != '\0')
{
i = 0;
if((*str >= '0' && *str <= '9') || (*str >= 'A' && *str <= 'Z') || (*str >= 'a' && *str <= 'z') || *str == '@' || *str == '*' || *str == '-' || *str == '.' || *str == '_')
{
i = 0;
}
else
{
i = 1;
}
if(i == 1)
{
out_buf[pos++] = '%';
out_buf[pos++] = buf[(unsigned char)*str >> 4];
out_buf[pos++] = buf[(unsigned char)*str & 0x0F];
}
else
{
out_buf[pos++] = *str;
}
str++;
}
out_buf[pos] = '\0';
return out_buf;
}
共通する使用プログラム
コード:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*前述のURLEncode関数のいずれか*/
int main(void) {
char in[300];
char* out;
fgets(in,sizeof(in),stdin);
if(strstr(in,"\n")!=NULL)*strstr(in,"\n")=0;
out=URLEncode(in);
printf("%s\n",out);
free(out);
return 0;
}
というか二つのif文は一つにまとめたほうがいいと思います。
メモリを無駄にするバージョン
コード:
char* URLEncode(char *str)
{
const unsigned char buf[] = "0123456789ABCDEF";
unsigned char* out_buf;
int pos;
pos=0;
out_buf=calloc(sizeof(char),strlen(str)*3+1);
while(*str != '\0')
{
if((*str >= '0' && *str <= '9') || (*str >= 'A' && *str <= 'Z') || (*str >= 'a' && *str <= 'z') || *str == '@' || *str == '*' || *str == '-' || *str == '.' || *str == '_')
{
out_buf[pos++] = *str;
}
else
{
out_buf[pos++] = '%';
out_buf[pos++] = buf[(unsigned char)*str >> 4];
out_buf[pos++] = buf[(unsigned char)*str & 0x0F];
}
str++;
}
out_buf[pos] = '\0';
return out_buf;
}
時間を無駄にするバージョン
コード:
char* URLEncode(char *str)
{
const unsigned char buf[] = "0123456789ABCDEF";
unsigned char* out_buf;
char* strbak;
int pos;
strbak=str;
pos=0;
while(*str != '\0')
{
if((*str >= '0' && *str <= '9') || (*str >= 'A' && *str <= 'Z') || (*str >= 'a' && *str <= 'z') || *str == '@' || *str == '*' || *str == '-' || *str == '.' || *str == '_')
{
pos++;
}
else
{
pos+=3;
}
str++;
}
out_buf=calloc(sizeof(char),pos+1);
str=strbak;
pos=0;
while(*str != '\0')
{
if((*str >= '0' && *str <= '9') || (*str >= 'A' && *str <= 'Z') || (*str >= 'a' && *str <= 'z') || *str == '@' || *str == '*' || *str == '-' || *str == '.' || *str == '_')
{
out_buf[pos++] = *str;
}
else
{
out_buf[pos++] = '%';
out_buf[pos++] = buf[(unsigned char)*str >> 4];
out_buf[pos++] = buf[(unsigned char)*str & 0x0F];
}
str++;
}
out_buf[pos] = '\0';
return out_buf;
}