ページ 11

文字が消える¥←これ

Posted: 2012年2月22日(水) 04:52
by おならちゃん。
絶対パスを取得するプログラムで、絶対パスの階層を表す¥これが消えてしまいます。
""の中には二回\\が入っているのにもかかわらず、一個減って表示されます。これはなぜなのでしょうか?
¥を三個にしたところエラーがでました。
ご回答よろしくお願いします。

コード:

void *fpath(char *user,char *yf){
char str[256];
	char path[]="C:\\Users\\";
	char apath[]="\\Pictures\\";
	char lpath[]="\\*.*";
	sprintf(str,"%s%s%s%s%s",path,user,apath,yf,lpath);
	printf("%s",str);
	return 0;
}
int main(){
	char user[25];
	char yf[25];
	char *full;

	printf("ユーザー名入力:");
	scanf("%s",&user);
	printf("\nフォルダ名入力:");
	scanf("%s",&yf);

	return 0;
}

Re: 文字が消える¥←これ

Posted: 2012年2月22日(水) 05:19
by パコネコ
簡単に言いますと、
「\」単体で書いても意味はありません。
2つ続けてあげてようやく1つとしてみなされます。

「\n」って使いますよね?こういう命令のために「\」は使用するため、ひとつではあらわせません。
ですが、あらわせないと困りますよね?
なので「\」のあとに「\」を書いて「\」をあらわしたいということになります。
(↑ちょっとわかりづらいかな?)

検索用単語:エスケープシーケンス
参照サイト(例):http://www9.plala.or.jp/sgwr-t/c/sec05.html

Re: 文字が消える¥←これ

Posted: 2012年2月22日(水) 06:03
by SUE
(注意、¥マークと\は同じと扱います。)
こんな話があります。すごく判りやすくて自分も頷かされました。

女性がある話を朗読して、それを男性が聞いて書き写す、という作業をしている人たちがいます。

あるところまで読んだとき、女性は「もうこの話には続きが無い」という意味で、『はい、これで終わりです。』と言いました。男性はそれを聞いて、『はい、これで終わりです。』と書きました。つまり、文章の中に『はい、これで終わりです。』とある、と勘違いしたのです。

女性は作業を一旦中断して、『はい、これで終わりです。』といったらもうおしまいにしましょう、と男性に言いました。

また別の作業のとき。またあるところまで読んだとき、また女性が『はい(略)』と言いました。男性は書くのをやめましたが、今度は本当に文章の中に『はい(略)』と書いてありました。また女性は作業を中断し、悩んだ末、このように決まりました。

『はい(略)』と言ったときは男性が一旦書くのをやめて女性の話を聞き、もう一回『はい(略)』と言ったときだけ、作業を再開し、『はい(略)』と一回書く。そうでなければ、書くのはおしまい。

とまあこれで判ったかと思いますが、この『はい(略)』がCの「エスケープシーケンス」にあたります。実際にはもっといろんなルールがあるのですが、この話に登場した「終わりを示すもの」は実際にCでも存在し、「\0」と表記されます(ヌル文字、ナル文字とも)。char型配列に文字を代入するときは、文字列より1バイト以上大きくなければいけない、というのは知っていますよね? 実はその1バイトには「\0」が勝手に追加されているのです。

で、女性が『はい(略)』『はい(略)』と言うのは、Cの「\\」に相当するわけです。一文字消える原因はこれです。

このように、「文字では直接表せないけど必要な情報」をあらわすために、エスケ-プシーケンスは存在しているのです。

Re: 文字が消える¥←これ

Posted: 2012年2月22日(水) 08:09
by box
おならちゃん。 さんが書きました:絶対パスを取得するプログラムで、絶対パスの階層を表す¥これが消えてしまいます。
""の中には二回\\が入っているのにもかかわらず、一個減って表示されます。これはなぜなのでしょうか?
\\と2個書いたのはなぜ、という疑問が残ります。
\だけだとまずい、ということがわかっていたからではないのでしょうか。

Re: 文字が消える¥←これ

Posted: 2012年2月22日(水) 09:24
by softya(ソフト屋)
どうもちゃんとした入門書籍を読まれていない気がします。
「BohYoh.com【著書】新版明解C言語入門編」
http://www.bohyoh.com/Books/MeikaiC01/index.html
などを読まれては如何でしょうか?

Re: 文字が消える¥←これ

Posted: 2012年2月22日(水) 13:34
by Loki
ダブルクォーテーション内でダブルクォーテーション、シングルクォーテーション内でシングルクォーテーションを使いたいとき、
"\""
'\''
このようにエスケープしませんか。
\" ってやってるのに、\ は表示されませんよね。
それと同じです。
Cではエラーですが、他のとある言語で "\U" とすると、表示結果は U です。
このように、\ は多くのプログラミング言語で、特殊文字として扱われています。
\"→"
\'→'
のようになるように、
\\→\
はルールなんです。

Re: 文字が消える¥←これ

Posted: 2012年2月23日(木) 04:17
by おならちゃん。
パピネコさま、
ご回答ありがとうございます。
理解することが できました。
なぜ、消えてしまうのかを理解することができました。

SUEさま、
ご回答ありがとうございます。
たとえて下さったことで、PCのコンパイルが勘違いを起こしているということに気づきました。

Re: 文字が消える¥←これ

Posted: 2012年2月23日(木) 04:46
by おならちゃん。
boxさま
もともとはこのプログラムを書いたのですが、さすがに全部書くのは醜いと思い簡単にしました。結果
誤解が生まれてしまったのですみませんでした。

最初は\ひとつでやっていたのですが、反応しなかったのでprintf()でみたところ\が消えていました。なので、もうひとつ付け足したら成功したので、二つじゃないと反応しないことに気づきました。しかし、問題が起こりました。僕はSystemParametersInfoで使おうとしていたのですが、””で\\を二つつけてフルパスを直接指定すると、できるのですが、変数からだとしていできませんでした。

コード:

#include <stdio.h>
#include <string.h>
#include <direct.h>
#include <DxLib.h>

char str[256];

char *FindFile(char *fpath){

	WIN32_FIND_DATA fp;
	HANDLE hFind;
	char zpath[256];
	char copyp[256];
	int i=0;

	strcpy(copyp,fpath);
	hFind=FindFirstFile(fpath,&fp);
	FindNextFile(hFind,&fp);
	FindNextFile(hFind,&fp);
	i=strlen(copyp);
	copyp[(i-3)]='\0';
	do{
	if((fp.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        && strcmp(fp.cFileName,"..")!=0 && strcmp(fp.cFileName,".")!=0){
		printf("\n失敗したよ(´・ω・`)");
		break;
	}else{
		
		printf("\n成功したよ(´・ω・`)");
		printf("\n%s",fp.cFileName);
		wsprintf(zpath,"\n%s%s",copyp,fp.cFileName);
		printf("%s\n",zpath);
		SystemParametersInfo(SPI_SETDESKWALLPAPER,0,zpath,SPIF_UPDATEINIFILE|SPIF_SENDWININICHANGE);
	}}while(FindNextFile(hFind,&fp));

	FindClose(hFind);
	return fpath;
}
char *fpath(char *user,char *yf){
	char path[]="C:\\Users\\";
	char apath[]="\\Pictures\\";
	char lpath[]="\\*.*";
	sprintf(str,"%s%s%s%s%s",path,user,apath,yf,lpath);
	printf("%s",str);
	return str;
}
int main(){
	char user[25];
	char yf[25];
	char *full;

	printf("ユーザー名入力:");
	scanf("%s",&user);
	printf("\nフォルダ名入力:");
	scanf("%s",&yf);

	full = fpath(user,yf);
	FindFile(full);
	return 0;
}

Re: 文字が消える¥←これ

Posted: 2012年2月23日(木) 04:50
by おならちゃん。
Lokiさま、
ご回答ありがとうございました。 ルールなんですね!!
ほかの方法を検討しています。

Re: 文字が消える¥←これ

Posted: 2012年2月23日(木) 10:15
by びす
¥と文字1つ( n や t など)をつなぎ合わせて1文字にするというルールがあるため
普通に¥を表示するには¥¥と入力するルールになってます

¥¥と表示したい場合は¥¥¥¥ですね

Re: 文字が消える¥←これ

Posted: 2012年2月23日(木) 13:16
by beatle
C++11を使えば、生文字列リテラルの機能を使って
R"(C:\hoge\foo\bar)"
などと書けます。

Re: 文字が消える¥←これ

Posted: 2012年2月24日(金) 08:30
by おならちゃん。
びすさま、ご回答ありがとうございます!!!なるほど、三つでエラーがでたのであきらめていましたが、4つ書く手があったんですね!!
ありがとうございます。
しかし問題が、、、正常動作しませんでした。
あれれ?と思いきや自分の間抜けな問題に気づきました。
wsprintf(zpath,"\n%s%s",copyp,fp.cFileName);
これです。\nこれのせいでフルパスがおかしなことになっていたみたいです。
みなさま御回答ありがとうございました。

beatle さま
御回答ありがとうございました。
C++11@w@; なんか始めてききました。 
まだまだ、学ぶのに時間がかかりそうです。。。