文字列についての質問とコンパイル時の警告について
Posted: 2012年2月22日(水) 20:58
初めまして、プログラミングを始めて3ヶ月ほどの初心者です。
C言語とDXライブラリを使用してアクションRPGを作ろうとしています。
現在ファイル読み込みのプログラムを作っていて、あやふやだった文字列の扱いが
さらにわからなくなったので質問させていただきます。
まずはソースコードを。
ちなみにCSVファイルはこんな感じです。
2
4,test60x60.csv,euro1.png,40,2
5,test30x30.csv,euro1.png,18,27
以上のコードを実行するとデバックエラーとでてまともに動きません。
そこで自分なりに色々調べてコメントで問題の部分と書いてあるところを下記のように書き直すと、
予定通りの結果が得られました。
で、なぜ疑問がわいたのかというとファイル読み込みをする前は直接ソースコードに書いていまして、
その時の書き方が
のような感じで定義時に直接初期化して書いていて、文字列のあつかいについては
char *pass = "abcd"
と、
char pass[5]= "abcd" , char pass[] = "abcd"
は、一緒の事だと解釈していました。
で今回の事でどうも違う感じがしてあやふやだったのが、さらにこんがらがってきたので質問させて頂きました。
一応自分なりの考えとしましては、
ポインタを使うときは宣言の時に代入する時にしか使えなくて後から文字も変えることができない。(できるけど何が起こるかわからない)
一方、配列で要素数を決めていれば、後から文字を入れる事もできるし、変えることもできる。
と、思っています。
この考えはあっているのでしょうか? 間違っていれば指摘して頂けると幸いです。
すみませんが、あともう一つあります。
上記のファイル読み込みプログラムを実装してもエラーはでないのですが警告がほぼ毎回でます。
1>c:\users\go\desktop\製作\dxsample\vc\sample.cpp(27) : warning C4996: 'strtok':
This function or variable may be unsafe. Consider using strtok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
See online help for details.
1> c:\program files\microsoft visual studio 9.0\vc\include\string.h(166) : 'strtok' の宣言を確認してください。
この文がstrtokを使った数だけでます。実は以前はファイル読み込み関数に標準関数?のfopen関数などをつかっていたのですが
その時も似たような警告が出ていました。DXライブラリのファイル操作関数を使うようにしたら警告はでなくなったので
そのまま放置していましたが・・・・。
この警告は一体なんなのでしょうか?
長くなりましたがご教授頂けるとありがたいです。
よろしくお願いします。
C言語とDXライブラリを使用してアクションRPGを作ろうとしています。
現在ファイル読み込みのプログラムを作っていて、あやふやだった文字列の扱いが
さらにわからなくなったので質問させていただきます。
まずはソースコードを。
#include "DxLib.h"
#include <stdlib.h>
#include <string.h>
typedef struct{
int id;
char *pass; //問題の部分
char *chip;
int x,y;
}List_t;
int num;
List_t *list;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
SetDrawScreen( DX_SCREEN_BACK ) ;
int i , list_file;
char str[256];
list_file = FileRead_open("maplist.csv");
FileRead_gets( str, 256, list_file ) ;
num = atoi(strtok( str, ",\n" )); //最初の一行にリストの数が記載されているのでnumに代入
list = (List_t *)malloc(sizeof(List_t) * num); //リストの数値分メモリを確保
if (list == NULL) exit(0);
for( i=0 ; i<num ; i++ ){
FileRead_gets( str, 256, list_file ) ; //一行読み込み
list[i].id = atoi(strtok( str, ",\n" )); //文字列を分解してそれぞれ代入
strcpy(list[i].pass , strtok( NULL , ",\n" ));
strcpy(list[i].chip , strtok( NULL , ",\n" ));
list[i].x = atoi(strtok( NULL , ",\n" ));
list[i].y = atoi(strtok( NULL , ",\n" ));
}
FileRead_close(list_file);
printfDx("%d\n",num); //結果の表示
for( i=0 ; i<num ; i++ ){
printfDx("%d",list[i].id);
printfDx("%s",list[i].pass);
printfDx("%s",list[i].chip);
printfDx("%d",list[i].x);
printfDx("%d\n",list[i].y);
}
free(list);
ScreenFlip() ;
WaitKey() ;
DxLib_End() ;
return 0 ;
}
2
4,test60x60.csv,euro1.png,40,2
5,test30x30.csv,euro1.png,18,27
以上のコードを実行するとデバックエラーとでてまともに動きません。
そこで自分なりに色々調べてコメントで問題の部分と書いてあるところを下記のように書き直すと、
予定通りの結果が得られました。
typedef struct{
int id;
char pass[30]; //問題の部分
char chip[30]; //適当にファイルパス以上の長さの配列を宣言
int x,y;
}List_t;
その時の書き方が
typedef struct{
int id;
char *pass; //問題の部分
char *chip;
int x,y;
}List_t;
List_t list[2] = {
{ 4 , test60x60.csv , euro1.png ,40 ,2 },
{ 5 , test30x30.csv , euro1.png ,18 ,17 }
};
char *pass = "abcd"
と、
char pass[5]= "abcd" , char pass[] = "abcd"
は、一緒の事だと解釈していました。
で今回の事でどうも違う感じがしてあやふやだったのが、さらにこんがらがってきたので質問させて頂きました。
一応自分なりの考えとしましては、
ポインタを使うときは宣言の時に代入する時にしか使えなくて後から文字も変えることができない。(できるけど何が起こるかわからない)
一方、配列で要素数を決めていれば、後から文字を入れる事もできるし、変えることもできる。
と、思っています。
この考えはあっているのでしょうか? 間違っていれば指摘して頂けると幸いです。
すみませんが、あともう一つあります。
上記のファイル読み込みプログラムを実装してもエラーはでないのですが警告がほぼ毎回でます。
1>c:\users\go\desktop\製作\dxsample\vc\sample.cpp(27) : warning C4996: 'strtok':
This function or variable may be unsafe. Consider using strtok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
See online help for details.
1> c:\program files\microsoft visual studio 9.0\vc\include\string.h(166) : 'strtok' の宣言を確認してください。
この文がstrtokを使った数だけでます。実は以前はファイル読み込み関数に標準関数?のfopen関数などをつかっていたのですが
その時も似たような警告が出ていました。DXライブラリのファイル操作関数を使うようにしたら警告はでなくなったので
そのまま放置していましたが・・・・。
この警告は一体なんなのでしょうか?
長くなりましたがご教授頂けるとありがたいです。
よろしくお願いします。