【初心者歓迎】C/C++室 Ver.26【環境依存OK】

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2006/05/09(火) 00:47:37
>>9511
それだと、SCANF関数とやらを使っていない
953945:2006/05/09(火) 00:50:20
おまえらその程度かよ。がっかりだ
もう明日から会社来なくていいよ
954デフォルトの名無しさん:2006/05/09(火) 00:52:12
今時SCANFも使えないとはなさけない
955デフォルトの名無しさん:2006/05/09(火) 00:54:58
scanf なら使えますが。
956デフォルトの名無しさん:2006/05/09(火) 01:01:43
>>953 偽物は消え失せろ。正しくはscanfです。明日〆切りなんです。よろしくお願いします
957デフォルトの名無しさん:2006/05/09(火) 01:03:35
>>945,956
宿題はこっち↓

C/C++の宿題を片付けます 64代目
http://pc8.2ch.net/test/read.cgi/tech/1146323457/

まぁその質問内容じゃ無理だろうけど。
958デフォルトの名無しさん:2006/05/09(火) 01:03:53
>>945 の言ってる事の意味が分からん。
エスパーの登場キボンヌ。
959デフォルトの名無しさん:2006/05/09(火) 01:14:32
たぶんあれだ、ある数値の3乗を求めたいんじゃないのか?
960デフォルトの名無しさん:2006/05/09(火) 01:39:29
>>958
だからスレ違いの質問に構うなって。のうたりんか君は。
961デフォルトの名無しさん:2006/05/09(火) 03:16:17
下記の関数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;
}
962961:2006/05/09(火) 03:17:09
>>961の「上位引数」は「上位関数」の誤りです。
963デフォルトの名無しさん:2006/05/09(火) 03:18:51
>下記プログラムだとstringにNULLが返却されます。
何も返却されていない。
964デフォルトの名無しさん:2006/05/09(火) 03:21:13
965デフォルトの名無しさん:2006/05/09(火) 10:33:37
つ参照渡しと値渡し
966デフォルトの名無しさん:2006/05/09(火) 11:56:11
>>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';
967デフォルトの名無しさん:2006/05/09(火) 12:51:18
確保して返すタイプの関数を作るならこんなかんじがお勧め

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);
////////////////////////////////////////////////

これを出力してみると、
フォルダの先頭の方の英語の部分までの階層は表示されますが、日本語の部分からは表示されません。
どうしたらよいか具体的に教えてください。
お願いします。
969デフォルトの名無しさん:2006/05/09(火) 17:41:45
GetModuleFileNameW
970968:2006/05/09(火) 17:42:56
ちなみにVS2005のコンソールアプリなんですけど。
出力は普通に
wprintf_s(szFilePath);
wprintf_s(szFileName);
としてるだけです。
デバッガでみるとちゃんと中身は入ってるみたいなんですけど、
出力されないです。。。
971968:2006/05/09(火) 17:46:30
>>969
早速ありがとうございます。
試してみましたが結果は変わりませんでした。。
972デフォルトの名無しさん:2006/05/09(火) 17:48:40
wprintf_s("%s", szFilePath);
wprintf_s("%s", szFileName);

でどう?
973968:2006/05/09(火) 17:55:58
>>972
ありがとうございます。
それだとコンパイルエラーが出たので
wprintf_s(L"%s", szFilePath);
wprintf_s(L"%s", szFileName);
としてみました。

結果は、とりあえず出力されたという点では進展しましたが、
なんだか日本語のところは???????になってしまいました。
974デフォルトの名無しさん:2006/05/09(火) 17:58:20
あぁ、そういやそうだな。
で、何で表示されないんだろう・・・。
デバッガでは szFileName 内はちゃんとしてるんだよね?
975968:2006/05/09(火) 18:01:20
>>974
はい。
最終的にwprintf_sのところでは期待した内容になっております。
文字コードとかって関係ないですよね?
976デフォルトの名無しさん:2006/05/09(火) 18:04:25
とりあえず、

wprintf_s(L"%s", L"表示");
wprintf_s(L"表示");

は表示されるのかな?
977デフォルトの名無しさん:2006/05/09(火) 18:18:34
setlocale("")
978デフォルトの名無しさん:2006/05/09(火) 18:29:45
ああ、違う、
setlocale(LC_CTYPE , "");
か。

いずれにせよwchar_t系のコンソール出力はコード変換されてから出力されるんで
デフォルトのCロケールから適切なロケールに変更されてないと日本語は出力できないってだけ。
979968: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"));

}
981デフォルトの名無しさん:2006/05/09(火) 20:53:45
GCC(MinGW)でコンパイルして、time hoge.exe とするとExeの実行時間
がわかるといわれたんだが、

real
user
sys

と3つも出てる。
すまんが、各項目の意味を教えてください。

もしくは、説明しているサイトを教えてください。

よろしくお願い致します。
982デフォルトの名無しさん:2006/05/09(火) 21:09:50
983デフォルトの名無しさん:2006/05/09(火) 21:18:13
1度関数の中で宣言した値は関数の実行が終わったらどうなるんでしょうか?
たとえば、もう一回関数を呼び出して、値を読み出したらどうなるんでしょうか?
984デフォルトの名無しさん:2006/05/09(火) 21:21:39
試してみてはいかがでしょうか。
985デフォルトの名無しさん:2006/05/09(火) 21:23:57
staticじゃない限りはアレ
986デフォルトの名無しさん:2006/05/09(火) 21:32:19
今、試してみる環境が無いんじゃないか?
987デフォルトの名無しさん:2006/05/09(火) 21:43:52
スタックが壊れてなければ同じだから、
「試してみたら?」は危険かもな。
988デフォルトの名無しさん:2006/05/09(火) 22:46:27
初心者です。繰り返し文の中で

for(i=3;i <= n; i++)
{
strcpy(rr,ss[i]);
}

って書いたらstrcpyの()の中でひっかかったんですけど、
何が悪いのでしょうか?
よろしくお願いします。
989デフォルトの名無しさん:2006/05/09(火) 22:47:21
>>988
頭が悪いんじゃね?
「ひっかかった」ってなんだよ?
990デフォルトの名無しさん:2006/05/09(火) 22:48:02
>>988
「ひっかかった」とは?
それから、rrとssの定義がないと何も言えない。
991デフォルトの名無しさん:2006/05/09(火) 22:48:49
>>988 i と n もわからん。
992デフォルトの名無しさん:2006/05/09(火) 22:50:40
俺のESPが
バッファオーバランか
文字列リテラルの領域に書き込み
だと告げています
993デフォルトの名無しさん:2006/05/09(火) 22:53:14
とりあえず次スレを待て。
994988: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;

}
995988:2006/05/09(火) 22:56:33
ひっかかったというのは、ビルドするときにエラーが出たってことです。
説明不足でスミマセンでした・・・
996デフォルトの名無しさん:2006/05/09(火) 23:06:47
何がしたいのか分かりません><
997デフォルトの名無しさん:2006/05/09(火) 23:09:40
次スレ

【初心者歓迎】C/C++室 Ver.27【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1147183708/l50
998デフォルトの名無しさん:2006/05/09(火) 23:11:04
コンパイルエラーならエラーメッセージを貼れ

あとstrcpyのプロトタイプ宣言をよく読め
999デフォルトの名無しさん:2006/05/09(火) 23:14:48
>999
1000デフォルトの名無しさん:2006/05/09(火) 23:16:10
1000 なら究極言語誕生
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。