ページ 1 / 1
ポインタを使って文字列を出力する方法
Posted: 2018年6月30日(土) 15:08
by NightShift
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を出力できますでしょうか。
Re: ポインタを使って文字列を出力する方法
Posted: 2018年6月30日(土) 18:00
by Math
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>
Re: ポインタを使って文字列を出力する方法
Posted: 2018年6月30日(土) 19:53
by Math
上記は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: ポインタを使って文字列を出力する方法
Posted: 2018年6月30日(土) 20:55
by かずま
NightShift さんが書きました: ↑7年前
"const char *" の値を使用して型 "char *" のエンティティを初期化することはできません
と表示されます。ポインタを使ってどう書けば、Winterを出力できますでしょうか。
そのソースコードのファイル名の拡張子は何ですか?
コンパイラは何を使って、どのようにコンパイルしていますか?
C では、char *p; p = "Winter"; はエラーになりませんが、
C++ では、const char *p; p = "Winter"; と書かないと
エラーになります。
Re: ポインタを使って文字列を出力する方法
Posted: 2018年7月02日(月) 19:36
by NightShift
Mathさん、かずまさん
ご解答ありがとうございました。拡張子が.pccだったので、constを書き加えたら、
コンパイルできました。
Re: ポインタを使って文字列を出力する方法
Posted: 2018年7月03日(火) 03:23
by かずま
本当ですか?
.cpp だったのではありませんか?
あなたは C と C++ のどちらを学習しているんですか?
http://www9.plala.or.jp/sgwr-t/c/Q/ens10-4.html
ここは「初心者のためのポイント学習C言語」のページですよ。
const を付けないとエラーのなるのは C++ です。
拡張子を .c にしてみてください。
コンパイラは何を使って、どのようにコンパイルしていますか?
Re: ポインタを使って文字列を出力する方法
Posted: 2018年7月03日(火) 03:29
by かずま
Math さんが書きました: ↑7年前
文字列リテラルは書き込み禁止の領域に配置されます。
本当ですか?
次のプログラムをコンパイルして実行すると、どんなエラーが出ますか?
コード:
#include <stdio.h>
int main(void)
{
char *p;
p = "Winter";
p[3] = 'k'; // 文字列リテラルの一部を書き換える
printf("%s\n", p);
return 0;
}
Re: ポインタを使って文字列を出力する方法
Posted: 2018年7月03日(火) 22:37
by Math
char *p="Winter"; は char[]="Winter"; とちがって(たいてい)書き込み禁止の領域に配置されると本に書いてあったので処理系依存で VS2017,VS2008はアセンブラーで見ると(constをつけても)DATA セグメントに配置されていた( 実行結果はWinker です)失礼。