文字が消える¥←これ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
おならちゃん。

文字が消える¥←これ

#1

投稿記事 by おならちゃん。 » 12年前

絶対パスを取得するプログラムで、絶対パスの階層を表す¥これが消えてしまいます。
""の中には二回\\が入っているのにもかかわらず、一個減って表示されます。これはなぜなのでしょうか?
¥を三個にしたところエラーがでました。
ご回答よろしくお願いします。

コード:

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;
}

アバター
パコネコ
記事: 139
登録日時: 13年前
住所: 大阪

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

#2

投稿記事 by パコネコ » 12年前

簡単に言いますと、
「\」単体で書いても意味はありません。
2つ続けてあげてようやく1つとしてみなされます。

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

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

アバター
SUE
記事: 41
登録日時: 12年前

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

#3

投稿記事 by SUE » 12年前

(注意、¥マークと\は同じと扱います。)
こんな話があります。すごく判りやすくて自分も頷かされました。

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

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

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

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

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

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

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

このように、「文字では直接表せないけど必要な情報」をあらわすために、エスケ-プシーケンスは存在しているのです。
pop'n music 20 fantasia ポップンクエストPhase MAX Ⅱ ムラクモ/少年は空を辿る【Power Of Nature】

box
記事: 2002
登録日時: 13年前

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

#4

投稿記事 by box » 12年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

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

#5

投稿記事 by softya(ソフト屋) » 12年前

どうもちゃんとした入門書籍を読まれていない気がします。
「BohYoh.com【著書】新版明解C言語入門編」
http://www.bohyoh.com/Books/MeikaiC01/index.html
などを読まれては如何でしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Loki

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

#6

投稿記事 by Loki » 12年前

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

おならちゃん。

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

#7

投稿記事 by おならちゃん。 » 12年前

パピネコさま、
ご回答ありがとうございます。
理解することが できました。
なぜ、消えてしまうのかを理解することができました。

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

おならちゃん。

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

#8

投稿記事 by おならちゃん。 » 12年前

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: 文字が消える¥←これ

#9

投稿記事 by おならちゃん。 » 12年前

Lokiさま、
ご回答ありがとうございました。 ルールなんですね!!
ほかの方法を検討しています。

アバター
びす
記事: 31
登録日時: 12年前

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

#10

投稿記事 by びす » 12年前

¥と文字1つ( n や t など)をつなぎ合わせて1文字にするというルールがあるため
普通に¥を表示するには¥¥と入力するルールになってます

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

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

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

#11

投稿記事 by beatle » 12年前

C++11を使えば、生文字列リテラルの機能を使って
R"(C:\hoge\foo\bar)"
などと書けます。

おならちゃん。

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

#12

投稿記事 by おならちゃん。 » 12年前

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る