【初心者歓迎】C/C++室 Ver.26【環境依存OK】
953 :
945:2006/05/09(火) 00:50:20
おまえらその程度かよ。がっかりだ
もう明日から会社来なくていいよ
今時SCANFも使えないとはなさけない
scanf なら使えますが。
956 :
デフォルトの名無しさん:2006/05/09(火) 01:01:43
>>953 偽物は消え失せろ。正しくはscanfです。明日〆切りなんです。よろしくお願いします
>>945 の言ってる事の意味が分からん。
エスパーの登場キボンヌ。
たぶんあれだ、ある数値の3乗を求めたいんじゃないのか?
>>958 だからスレ違いの質問に構うなって。のうたりんか君は。
下記の関数hoge()内で文字列変数stringの領域確保を行って文字列を格納後、
仮引数で返却するようにしたいのですが、下記プログラムだとstringにNULLが返却されます。
malloc()で確保した領域は上位引数に返る際に解放されてしまうのでしょうか。
#include<stdio.h>
#include<stdlib.h>
void hoge(char *string);
int main(void)
{
char *string = NULL;
hoge(string);
printf("%s\n",string); /* nullが表示される */
return 0;
}
void hoge(char *string)
{
string = (char*)malloc(4);
string[0] = 'a';
string[1] = 'b';
string[2] = 'c';
string[3] = '\0';
return;
}
962 :
961:2006/05/09(火) 03:17:09
>>961の「上位引数」は「上位関数」の誤りです。
>下記プログラムだとstringにNULLが返却されます。
何も返却されていない。
つ参照渡しと値渡し
>>961 char *string = NULL;
hoge(string); /* ここで渡しているのは NULL */
hoge(char *string)
{
string = (char*)malloc(4); /* ここで書き換えているのは hoge ローカルの string */
string[0] = 'a';
main の string を書き換えるなら、そのポインタを渡すべき。
char *string = NULL;
hoge(&string); /* ここで渡しているのは string へのポインタ */
hoge(char **string)
{
*string = (char*)malloc(4); /* ここで書き換えているのは main の string */
(*string)[0] = 'a';
確保して返すタイプの関数を作るならこんなかんじがお勧め
extern char *alloc_hoge();
extern char free_hoge(char *string);
int main(void)
{
char *string = alloc_hoge(); /* 確保 */
/*いろいろ処理*/
free_hoge(string); /* 後始末 */
}
char *alloc_hoge()
{
char *string = (char*)malloc(4);
/*いろいろ代入*/
return string;
}
char free_hoge(char *string)
{
free(string);
}
968 :
デフォルトの名無しさん:2006/05/09(火) 17:37:35
日本語を含んだフォルダやファイル名を取得したいのですが、
_wsplitpath_s を使っても取得できません。
//////////////////////////////////////////////////////
WCHAR szPath[_MAX_PATH];
GetModuleFileName( NULL, szPath, sizeof(szPath));
// フルパスを分解
WCHAR szDir[_MAX_DIR];
WCHAR szDrive[_MAX_DRIVE];
WCHAR szFName[_MAX_FNAME];
WCHAR szExt[_MAX_EXT];
_wsplitpath_s(szPath,szDrive,szDir,szFName,szExt);
// フォルダ、ファイル名取得
WCHAR szFilePath[_MAX_PATH];
WCHAR szFileName[_MAX_PATH];
wcscpy_s(szFilePath,szDrive);
wcscat_s(szFilePath,szDir);
wcscpy_s(szFileName,szFName);
wcscat_s(szFileName,szExt);
////////////////////////////////////////////////
これを出力してみると、
フォルダの先頭の方の英語の部分までの階層は表示されますが、日本語の部分からは表示されません。
どうしたらよいか具体的に教えてください。
お願いします。
GetModuleFileNameW
970 :
968:2006/05/09(火) 17:42:56
ちなみにVS2005のコンソールアプリなんですけど。
出力は普通に
wprintf_s(szFilePath);
wprintf_s(szFileName);
としてるだけです。
デバッガでみるとちゃんと中身は入ってるみたいなんですけど、
出力されないです。。。
971 :
968:2006/05/09(火) 17:46:30
>>969 早速ありがとうございます。
試してみましたが結果は変わりませんでした。。
wprintf_s("%s", szFilePath);
wprintf_s("%s", szFileName);
でどう?
973 :
968:2006/05/09(火) 17:55:58
>>972 ありがとうございます。
それだとコンパイルエラーが出たので
wprintf_s(L"%s", szFilePath);
wprintf_s(L"%s", szFileName);
としてみました。
結果は、とりあえず出力されたという点では進展しましたが、
なんだか日本語のところは???????になってしまいました。
あぁ、そういやそうだな。
で、何で表示されないんだろう・・・。
デバッガでは szFileName 内はちゃんとしてるんだよね?
975 :
968:2006/05/09(火) 18:01:20
>>974 はい。
最終的にwprintf_sのところでは期待した内容になっております。
文字コードとかって関係ないですよね?
とりあえず、
wprintf_s(L"%s", L"表示");
wprintf_s(L"表示");
は表示されるのかな?
setlocale("")
ああ、違う、
setlocale(LC_CTYPE , "");
か。
いずれにせよwchar_t系のコンソール出力はコード変換されてから出力されるんで
デフォルトのCロケールから適切なロケールに変更されてないと日本語は出力できないってだけ。
979 :
968:2006/05/09(火) 18:38:16
>>976 表示できませんでした・・・
のですが、
>>977の方に教えていただいた
setlocale( LC_ALL,L"japanese");
を試したらいけました!
皆さんありがとうございました。
980 :
デフォルトの名無しさん:2006/05/09(火) 19:10:19
>>979 ついでに、Visual Studio 2005のデフォとかlocaleとか入ってないので萎える。
#include <tchar.h>
#include <clocale>
#include <cstdio>
#include <windows.h>
void _tmain(void){
_tsetlocale(LC_ALL, _T("jpn")); // これ忘れると、NT系とか日本語ダメだよね。
_tprintf(_T("ごるぁぁもまえら\n"));
}
GCC(MinGW)でコンパイルして、time hoge.exe とするとExeの実行時間
がわかるといわれたんだが、
real
user
sys
と3つも出てる。
すまんが、各項目の意味を教えてください。
もしくは、説明しているサイトを教えてください。
よろしくお願い致します。
1度関数の中で宣言した値は関数の実行が終わったらどうなるんでしょうか?
たとえば、もう一回関数を呼び出して、値を読み出したらどうなるんでしょうか?
試してみてはいかがでしょうか。
staticじゃない限りはアレ
今、試してみる環境が無いんじゃないか?
スタックが壊れてなければ同じだから、
「試してみたら?」は危険かもな。
初心者です。繰り返し文の中で
for(i=3;i <= n; i++)
{
strcpy(rr,ss[i]);
}
って書いたらstrcpyの()の中でひっかかったんですけど、
何が悪いのでしょうか?
よろしくお願いします。
>>988 頭が悪いんじゃね?
「ひっかかった」ってなんだよ?
>>988 「ひっかかった」とは?
それから、rrとssの定義がないと何も言えない。
俺のESPが
バッファオーバランか
文字列リテラルの領域に書き込み
だと告げています
とりあえず次スレを待て。
994 :
988:2006/05/09(火) 22:55:53
スミマセン。これが全文です(´ヘ`;)
#include <stdio.h>
#include <string.h>
int main(void)
{
int i,n;
char ss[80] , rr[80];
strcpy(rr,"aa");
gets(ss);
n = strlen(ss);
for(i=3;i <= n; i++)
{
strcpy(rr,ss[i]);
}
printf("%s\n",rr);
return 0;
}
995 :
988:2006/05/09(火) 22:56:33
ひっかかったというのは、ビルドするときにエラーが出たってことです。
説明不足でスミマセンでした・・・
何がしたいのか分かりません><
コンパイルエラーならエラーメッセージを貼れ
あとstrcpyのプロトタイプ宣言をよく読め
>999
1000 なら究極言語誕生
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。