Axe

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
コンパイルは通るのに実行できません

Axe

#1

投稿記事 by コンパイルは通るのに実行できません » 9年前

コード:

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;
}
コンパイルが通るってことは正常ってことぢゃないのですか?
実行ファイルが作成されて実行すると処理が停止してエラーになります。
なぜでしょうか?

アバター
パコネコ
記事: 139
登録日時: 9年前
住所: 大阪

Re: Axe

#2

投稿記事 by パコネコ » 9年前

プログラムはこれだけですか?
(mainとかは?)

あと名前と題名間違えてません?
=====
ついでに
これはミスですか?
if(i = 1)
最後に編集したユーザー パコネコ on 2010年12月17日(金) 14:06 [ 編集 1 回目 ]
ニャン!!\(゜ロ\)(/ロ゜)/

アバター
みけCAT
記事: 6247
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: Axe

#3

投稿記事 by みけCAT » 9年前

*out_bufを初期化していないようですが、大丈夫ですか?

if(i = 1)
とあるのは
if(i == 1)
の間違いではないのですか?

return out_buf;
では、最後のnull文字のポインタが返りますが、仕様ですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
沖 滉均
記事: 237
登録日時: 9年前
住所: K県F市

Re: Axe

#4

投稿記事 by 沖 滉均 » 9年前

名前と件名が逆のようですが間違えられたのでしょう…
また、環境等が書かれていませんので書いてある情報だけで答えさせていただきます。

上記のコードはこれで全てなのでしょうか?
main関数がないためコンパイルが通らないと思います
また、必ずしもコンパイルが通れば全て正常に動くという保障はありません。
動かないコードでもコンパイルが通ってしまう場合もあります。
There is no royal road to learning.
codeタグで指定できる言語
画像

Axe

#5

投稿記事 by Axe » 9年前

メインはこんな感じです。

コード:

int main()
{
	char *buf;
	char in[10240];

	printf("文字列 : ");
	scanf("%s",&in);

	buf = URLEncode(in);

	printf("%s",buf);
	getch();
}

アバター
みけCAT
記事: 6247
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: Axe

#6

投稿記事 by みけCAT » 9年前

とりあえず上で指摘したポイントを直してみました。
全角文字を入力すると文字化けしたので、それも直しておきました。

コード:

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';
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6247
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: Axe

#7

投稿記事 by みけCAT » 9年前

これを使ったプログラムです。

コード:

#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;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6247
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: Axe

#8

投稿記事 by みけCAT » 9年前

Axe さんが書きました:scanf("%s",&in);
これは間違っています。
苦しんで覚えるC言語(苦C)などで勉強してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Axe

Re: Axe

#9

投稿記事 by Axe » 9年前

やっぱり
void URLEncode(char* out_ptr,char *str)
こういう形になりますか・・・
私もこの形では作れたのですがreturnを使って
buf = URLEncode(in);
というように取得したかったんですが・・・
できますかね?

アバター
みけCAT
記事: 6247
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: Axe

#10

投稿記事 by みけCAT » 9年前

コード:

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;
}
ちゃんとバッファを確保しましょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6247
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: Axe

#11

投稿記事 by みけCAT » 9年前

バッファは動的確保の方がいいと思います。
前のプログラムはマルチスレッドに対応していないかもしれません。
動的確保したらちゃんと解放しましょう。

どちらも無駄は大したことはありません。
メモリを無駄にするバージョン(必ず入力の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;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

“C言語何でも質問掲示板” へ戻る