ポインタを使って文字列を出力する方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
NightShift
記事: 10
登録日時: 6年前

ポインタを使って文字列を出力する方法

#1

投稿記事 by NightShift » 5年前

http://www9.plala.or.jp/sgwr-t/c/Q/ens10-4.html

次のプログラムの空欄部を埋めて、プログラムを完成させなさい。

コード:

#include <stdio.h>

int main( void )
{
	char *p;
	p = "Winter";
	printf( "%s \n", p );
	
	return 0;
} 
上記のリンクにある、上記の問題の回答が、
上記のソースコードですが、
p = "Winter";
の部分で、
"const char *" の値を使用して型 "char *" のエンティティを初期化することはできません
と表示されます。ポインタを使ってどう書けば、Winterを出力できますでしょうか。

Math

Re: ポインタを使って文字列を出力する方法

#2

投稿記事 by Math » 5年前

charへのポインターを 文字列リテラル で初期化します。文字列リテラルは書き込み禁止の領域に配置されます。
c1.c

コード:

#include <stdio.h>

int main( void )
{
	char *p;
	const char *a = "Winter";
	printf( "%s \n", p = a );
	
	return 0;
}
c.bat

コード:

rem コンパイル後リンク
cl /TC c1.c
rem 実行結果
c1.exe
実行結果

コード:

F:\z18c\0630>c

F:\z18c\0630>rem コンパイル後リンク

F:\z18c\0630>cl /TC c1.c
Microsoft(R) C/C++ Optimizing Compiler Version 19.13.26128 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

c1.c
c1.c(7): warning C4090: '=': 異なる 'const' 修飾子です。
Microsoft (R) Incremental Linker Version 14.13.26128.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:c1.exe
c1.obj

F:\z18c\0630>rem 実行結果

F:\z18c\0630>c1.exe
Winter

F:\z18c\0630>

Math

Re: ポインタを使って文字列を出力する方法

#3

投稿記事 by Math » 5年前

上記はVS2017Communityの場合です。

VS2008では

c1.c

コード:

#include <stdio.h>

int main( void )
{
	char *p;
	p = "Winter";
	printf( "%s \n", p );
	
	return 0;
}
c.bat

コード:

rem コンパイル後リンク
cl /TC c1.c
rem 実行結果
c1.exe
実行結果

コード:

F:\z18c\0630>c

F:\z18c\0630>rem コンパイル後リンク

F:\z18c\0630>cl /TC c1.c
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

c1.c
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:c1.exe
c1.obj

F:\z18c\0630>rem 実行結果

F:\z18c\0630>c1.exe
Winter

F:\z18c\0630>
参考サイトが古いですね!(^^;

かずま

Re: ポインタを使って文字列を出力する方法

#4

投稿記事 by かずま » 5年前

NightShift さんが書きました:
5年前
"const char *" の値を使用して型 "char *" のエンティティを初期化することはできません
と表示されます。ポインタを使ってどう書けば、Winterを出力できますでしょうか。
そのソースコードのファイル名の拡張子は何ですか?
コンパイラは何を使って、どのようにコンパイルしていますか?

C では、char *p; p = "Winter"; はエラーになりませんが、
C++ では、const char *p; p = "Winter"; と書かないと
エラーになります。

NightShift
記事: 10
登録日時: 6年前

Re: ポインタを使って文字列を出力する方法

#5

投稿記事 by NightShift » 5年前

Mathさん、かずまさん

ご解答ありがとうございました。拡張子が.pccだったので、constを書き加えたら、
コンパイルできました。

かずま

Re: ポインタを使って文字列を出力する方法

#6

投稿記事 by かずま » 5年前

NightShift さんが書きました:
5年前
拡張子が.pccだったので、
本当ですか?
.cpp だったのではありませんか?

あなたは C と C++ のどちらを学習しているんですか?

http://www9.plala.or.jp/sgwr-t/c/Q/ens10-4.html
ここは「初心者のためのポイント学習C言語」のページですよ。

const を付けないとエラーのなるのは C++ です。
拡張子を .c にしてみてください。

コンパイラは何を使って、どのようにコンパイルしていますか?

かずま

Re: ポインタを使って文字列を出力する方法

#7

投稿記事 by かずま » 5年前

Math さんが書きました:
5年前
文字列リテラルは書き込み禁止の領域に配置されます。
本当ですか?

次のプログラムをコンパイルして実行すると、どんなエラーが出ますか?

コード:

#include <stdio.h>

int main(void)
{
	char *p;
	p = "Winter";
	p[3] = 'k';   // 文字列リテラルの一部を書き換える
	printf("%s\n", p);
	return 0;
}

Math

Re: ポインタを使って文字列を出力する方法

#8

投稿記事 by Math » 5年前

char *p="Winter"; は char[]="Winter"; とちがって(たいてい)書き込み禁止の領域に配置されると本に書いてあったので処理系依存で VS2017,VS2008はアセンブラーで見ると(constをつけても)DATA セグメントに配置されていた( 実行結果はWinker です)失礼。

返信

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