掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.24124

swprintfで強制終了
投稿者---とおる(2005/11/14 10:58:34)


こんにちは。
ワイド文字を使った関数swprintfを下記のように使っています。

swprintf(wtmp,8192,L"%ls %ls '%ls' ",wstr1,wstr2,wstr3);

上記関数にwstr3に奇数桁の数字(例えば、wstr3=1234567)が
入れば上記関数は実行され、偶数桁の数字(例えば、wstr3=
123456)が入れば強制終了されてしまいます。

関数の使い方が間違っているのでしょうか。

ワイド文字の関数は、殆ど使ったことがないので困惑しています。

どなたか教えて頂けないでしょうか。
宜しくお願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:swprintfで強制終了 24125 REE 2005/11/14 11:13:08
<子記事> Re:swprintfで強制終了 24129 BlackWind 2005/11/14 13:25:18
<子記事> Re:swprintfで強制終了 24148 nop 2005/11/15 00:44:06


No.24125

Re:swprintfで強制終了
投稿者---REE(2005/11/14 11:13:08)




>ワイド文字を使った関数swprintfを下記のように使っています。
>
>swprintf(wtmp,8192,L"%ls %ls '%ls' ",wstr1,wstr2,wstr3);

引数がおかしいです。
snwprintfと混同していませんか?



この投稿にコメントする

削除パスワード

No.24126

Re:swprintfで強制終了
投稿者---とおる(2005/11/14 12:06:38)


こんにちは。
REEさん、ありがとうございます。

すみません。
先ほどから随分調べていたのですが、
混同しているのかどうかさえ解らない
状態です。

実は、前任者の方が記述したのですが、
その前任者の方が辞められて、今現在
僕が引き継いでいる状況なんです。

聞こうにも周りの方が知ってられない
ため、聞けない状況です。

何が間違っているのかご指摘願えない
でしょうか。

やはり提示した関数では、偶数桁奇数桁
でエラーが出たり出なかったりするので
しょうか。

恐れ入りますが、宜しくお願いします。


この投稿にコメントする

削除パスワード

No.24127

Re:swprintfで強制終了
投稿者---REE(2005/11/14 12:10:08)


>こんにちは。
>REEさん、ありがとうございます。
>
>すみません。
>先ほどから随分調べていたのですが、
>混同しているのかどうかさえ解らない
>状態です。

まず、swprintfとsnwprintfの違いを調べてください。



この投稿にコメントする

削除パスワード

No.24128

Re:swprintfで強制終了
投稿者---YuO(2005/11/14 12:14:34)


>>ワイド文字を使った関数swprintfを下記のように使っています。
>>swprintf(wtmp,8192,L"%ls %ls '%ls' ",wstr1,wstr2,wstr3);

強制終了します,だけでは回答のしようがありません。
強制終了時に表示される文字列や,デバッガを使った場合に得られる情報なども提示してください。

とりあえず,コードを見た限り,そのような問題は起きないと思いますが……。


>引数がおかしいです。
>snwprintfと混同していませんか?

標準規格に,snwprintfなどという関数は存在しません。
# snprintfはある――ISO/IEC 9899:1999による追加。

また,ISO/IEC 9899:1999の7.24.2.3 The swprintf functionには,
#include <wchar.h>
int swprintf(wchar_t * restrict s,
     size_t n,
     const wchar_t * restrict format, ...);

とあります。
# swprintfはISO/IEC 9899/AMD1:1995による追加。


この投稿にコメントする

削除パスワード

No.24130

Re:swprintfで強制終了
投稿者---REE(2005/11/14 13:59:22)


>>引数がおかしいです。
>>snwprintfと混同していませんか?
>
>標準規格に,snwprintfなどという関数は存在しません。
># snprintfはある――ISO/IEC 9899:1999による追加。
>
>また,ISO/IEC 9899:1999の7.24.2.3 The swprintf functionには,
><blockquote><pre>#include <wchar.h>
int swprintf(wchar_t * restrict s,
size_t n,
const wchar_t * restrict format, ...);</pre></blockquote>
>とあります。
># swprintfはISO/IEC 9899/AMD1:1995による追加。

失礼しました。
swprintfに2種類あるのを知りませんでした。


この投稿にコメントする

削除パスワード

No.24132

Re:swprintfで強制終了
投稿者---YuO(2005/11/14 14:36:27)


>swprintfに2種類あるのを知りませんでした。

ん?
1種類しかないですが。
C95においても,
int swprintf(wchar_t *, size_t, const wchar_t *, ...);

でしたが。

もし,Visual C++.NET 2003までのヘッダ等を参照しているのであれば,Run-Time Library Reference - sprintf, swprintfをちゃんと読んでおいた方がよいです。
# ちなみに,2005では標準準拠になりました。
さらに,MSの書式指定系ライブラリは,ワイド文字列の扱いが非標準ですから,利用には注意する必要があります。
# 標準ではワイド文字列に対して常に%lsを使うが,MSではfprintf/fscanf系では%S,fwprintf/fwscanf系では%sを使う。



この投稿にコメントする

削除パスワード

No.24141

Re:swprintfで強制終了
投稿者---REE(2005/11/14 18:11:21)


>もし,Visual C++.NET 2003までのヘッダ等を参照しているのであれば,Run-Time Library Reference - sprintf, swprintfをちゃんと読んでおいた方がよいです。

そのリンク先に引数の差で2種類あるように見えるのは、
まだ何か勘違いしているからでしょうか?

# 2つ目には、戻り値の型もない・・



この投稿にコメントする

削除パスワード

No.24150

Re:swprintfで強制終了
投稿者---まきじ(2005/11/15 02:36:18)


>そのリンク先に引数の差で2種類あるように見えるのは、
>まだ何か勘違いしているからでしょうか?

現行の規格(C99)では swprintf() の関数原型宣言は

int swprintf(wchar_t *, size_t, const wchar_t *, ...);

であり

int swprintf(wchar_t *, const wchar_t *, ...);
int snwprintf(wchar_t *, size_t, const wchar_t *, ...);

は各処理系が勝手に定義したもので
規格に準拠してない関数で、規格に準拠にするには

#define swprintf snwprintf

とすれば解決できます。ということでは?


この投稿にコメントする

削除パスワード

No.24129

Re:swprintfで強制終了
投稿者---BlackWind(2005/11/14 13:25:18)


>こんにちは。
>ワイド文字を使った関数swprintfを下記のように使っています。
>
>swprintf(wtmp,8192,L"%ls %ls '%ls' ",wstr1,wstr2,wstr3);
>
>上記関数にwstr3に奇数桁の数字(例えば、wstr3=1234567)が
>入れば上記関数は実行され、偶数桁の数字(例えば、wstr3=
>123456)が入れば強制終了されてしまいます。
>
>関数の使い方が間違っているのでしょうか。

とりあえず。
環境(OSとコンパイラ)を書いてください。

強制終了とは?
アプリが何もいわずに落ちるのでしょうか?

# 引き継いだって事は、潜在バグなのか…。
# そこを直したら次々とバグが…というオチが怖いですね(・・;)



この投稿にコメントする

削除パスワード

No.24131

Re:swprintfで強制終了
投稿者---とおる(2005/11/14 14:18:01)


こんにちは。
色々すみません。

>とりあえず。
>環境(OSとコンパイラ)を書いてください。
環境
RedHatLinux9、apache、OpenSSL、modSSL、OCI
(コンパイラは良く解りません)
(makeファイルを作ってコンパイルしています)

>強制終了とは?
>アプリが何もいわずに落ちるのでしょうか?
error_logに何も書き出しません。
swprintfの前後にerror_logに書き出すよう
デバッグしてみました。
それで、前後のデバッグを書き出すときと
前のみ書き出すときがあり、強制終了と判断
しました。

申し訳ございません。
宜しくお願いします。


この投稿にコメントする

削除パスワード

No.24133

Re:swprintfで強制終了
投稿者---RiSK(2005/11/14 14:41:10)


>swprintf(wtmp,8192,L"%ls %ls '%ls' ",wstr1,wstr2,wstr3);

wtmp, wstr1, wstr2, wstr3はどのように宣言されていますか?
swprintf は何を返しますか? 返す前に落ちますか?
関係ないと思うけど ' を \' とエスケープしても変わりませんか?

>(コンパイラは良く解りません)
>(makeファイルを作ってコンパイルしています)

??? make ファイルを開けば分かりますよ。
CC = 何になっていますか?

>>強制終了とは?
>>アプリが何もいわずに落ちるのでしょうか?
>error_logに何も書き出しません。

答えになっていないような。
core dump を吐くとか無いのでしょうか…。


この投稿にコメントする

削除パスワード

No.24148

Re:swprintfで強制終了
投稿者---nop(2005/11/15 00:44:06)


>swprintf(wtmp,8192,L"%ls %ls '%ls' ",wstr1,wstr2,wstr3);
>上記関数にwstr3に奇数桁の数字(例えば、wstr3=1234567)が
>入れば上記関数は実行され、偶数桁の数字(例えば、wstr3=
>123456)が入れば強制終了されてしまいます。

何故、各変数の型すら明記しないのでしょうか?

>上記関数にwstr3に奇数桁の数字(例えば、wstr3=1234567)が
>入れば上記関数は実行され、偶数桁の数字(例えば、wstr3=
>123456)が入れば強制終了されてしまいます。

の文から、書式指定子と引数の型が合っていないのではないか?
と読めてしまいますよ?


後、デバッガの使い方くらいは覚えましょう!


この投稿にコメントする

削除パスワード

No.24160

Re:swprintfで強制終了
投稿者---とおる(2005/11/15 17:51:25)


こんにちは。
コンパイラは、gccでした。

>何故、各変数の型すら明記しないのでしょうか?
遅くなって申し訳ございません。
ワイド文字なので、wchar_tで宣言しています。

>>上記関数にwstr3に奇数桁の数字(例えば、wstr3=1234567)が
>>入れば上記関数は実行され、偶数桁の数字(例えば、wstr3=
>>123456)が入れば強制終了されてしまいます。
>
>の文から、書式指定子と引数の型が合っていないのではないか?
>と読めてしまいますよ?
すみません。
wstr3=123456と書いてしまいましたが、ワイド文字に変換した
データ(wchar_t宣言の変数)が入ります。
桁数が違った場合、すんなり実行されますので、書式指定子と
引数の型の違いと判断できませんでした。

>後、デバッガの使い方くらいは覚えましょう!
すみません。
デバッガの使い方(というより、デバッガがあること自体知り
ませんでした)が判らなかったので、ファイルに書き出して
いました。

不勉強で、ご迷惑をお掛けします。
宜しくお願いします。


この投稿にコメントする

削除パスワード

No.24169

Re:swprintfで強制終了
投稿者---si(2005/11/16 01:16:40)


>環境 RedHatLinux9、apache、OpenSSL、modSSL、OCI
ということは、WEBアプリですか?


この投稿にコメントする

削除パスワード

No.24172

Re:swprintfで強制終了
投稿者---nop(2005/11/16 09:58:38)


>>何故、各変数の型すら明記しないのでしょうか?
>遅くなって申し訳ございません。
>ワイド文字なので、wchar_tで宣言しています。

念のため、変数を定義している箇所のソースも載せて下さると、
より有効な回答が得られると思います。
情報の小出しはやめましょう。


>wstr3=123456と書いてしまいましたが、ワイド文字に変換した
>データ(wchar_t宣言の変数)が入ります。
>桁数が違った場合、すんなり実行されますので、書式指定子と
>引数の型の違いと判断できませんでした。

wchar_tの変数は、配列ですか?
そして、「%s」に沿って文字列の終端を意味する終端文字は、
正しく設定していますか?
また、本当に有効な文字コードが格納されていますか?



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧