質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

コピー

元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

Q&A

解決済

4回答

2105閲覧

”こんにちは”を一文字ずつ表示させたい

hirosann15

総合スコア18

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

コピー

元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

0グッド

0クリップ

投稿2020/06/29 08:36

#include <stdio.h> #include <stdlib.h> int main(void) { char s[100]="こんにちは"; malloc(sizeof(int)*100); char *a; a=malloc(sizeof(int)*100); int i; a=s; for (i=0;i<100; i++){ printf(" a[%d] : %d\n", i, a[i] ); } return 0; }

for文を使って文字列変数sの内容を使って一文字ずつaにコピーしたいと思うのですが、この場合すべてa[数字]0;になってしまいました。個人的にはa=s;の部分が怪しいと思っているのですが直し方がわかりません。どのようにすればコンパイルしたときに一文字ずつ
a[0] こ ; a[1]ん ; a[2] に ; a[3] ち ;a[4] は; 
と表示させることができますか。回答とまではいかないと思いますので、回答にたどり着くためのヒントのようなものをお願いしたいと思います。
お返事お待ちしております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/06/29 09:36

> 個人的にはa=s;の部分が怪しい 当たりで、まったくコピーになっていません。コピーと、1文字づつ表示、と言うのを分けて考える必要があります。
kazuma-s

2020/06/29 10:39 編集

> この場合すべてa[数字]0;になってしまいました。 本当ですか? なぜ 100という大きな数字を使うんですか? 100 の代わりに 20 を使うとどうなりますか? 質問は編集できますので、現在の現象を正しく追記してください。
guest

回答4

0

ええと、まずは「あいうえお」ではなく、「abcde」が1文字ずつ表示されるプログラムを作ってください。というのも、charの範囲にひらがな1文字が入りきらないので。

投稿2020/06/29 08:49

編集2020/06/29 08:51
Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

まず、提示のコードで全部0というのはなにかおかしいですね
少なくとも先頭の十数バイトは0以外が出ると思いますが。

printf(" a[%d] : %d\n", i, a[i] );

%dというのは数値出力ですよ。

投稿2020/06/29 08:47

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

OS は何ですか?  Linux、Windows、Mac OS ?
コンパイラは何ですか? gcc、Visual C++ ?
文字コードは何ですか? UTF-8、Shift-JIS ?

次のコードの実行結果はどうなりますか?

C

1#include <stdio.h> // printf, putchar 2#include <stdlib.h> // mbstowcs 3#include <locale.h> // setlocale 4 5int main(void) 6{ 7 char s[] = "こんにちは"; 8 setlocale(LC_CTYPE, ""); 9 wchar_t a[6]; 10 int n = mbstowcs(a, s, 6); 11 for (int i = 0; i < n; i++) 12 printf("a[%d] %lc; ", i, a[i]); 13 putchar('\n'); 14}

wchar_t を使わず、マルチバイト文字のまま扱う次のコードの実行結果はどうなりますか?

C

1#include <stdio.h> // printf, putchar 2#include <stdlib.h> // mblen, MB_CUR_MAX 3#include <locale.h> // setlocale 4 5int main(void) 6{ 7 char s[] = "こんにちは"; 8 setlocale(LC_CTYPE, ""); 9 char *p = s; 10 for (int i = 0; *p; i++) { 11 int n = mblen(p, MB_CUR_MAX); 12 printf("a[%d] %.*s; ", i, n, p); 13 p += n; 14 } 15 putchar('\n'); 16}

理解できない場合はどこが分からないのかを質問してください。

投稿2020/06/29 12:21

編集2020/06/29 12:30
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

a[0] こ ; a[1]ん ; a[2] に ; a[3] ち ;a[4] は; 

C言語という前提の場合、できません。
全部 0というのも変ですね。手元の環境 (Windows10 VC++2019)だと、

text

1 a[0] : -126 2 a[1] : -79 3 a[2] : -126 4 a[3] : -15 5 a[4] : -126 6 a[5] : -55 7 a[6] : -126 8 a[7] : -65 9 a[8] : -126 10 a[9] : -51 11 a[10] : 0 12 a[11] : 0 13....

となりました。

C言語の char は 1バイトを意味します。その一方、日本語の文字は、1文字で複数バイトが必要となります。従って、期待する結果にはなりません。
なお、1文字が何バイト必要かは、環境に依存し、手元の環境は、Shift-JISなので 1文字 = 2バイトとなります。

他にも色々と意味不明のコードがありますが、とりあえず。

投稿2020/06/29 11:55

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問