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

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

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

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Q&A

解決済

6回答

1252閲覧

C sprintfの使い方について

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

0グッド

0クリップ

投稿2021/08/15 09:39

前提・実現したいこと

C言語についての質問です。
sprintfを使用して、1×10のを出力するプログラムを作成しているのですが、正しく表示させることが出来ず困って今います。
sprintfを使用して、char型text3の中身を作成したいです。

発生している問題・エラーメッセージ

*を1*10に表示したいが、コンソール画面に一つのみが表示され正しく表示されない。

該当のソースコード

c

1#include <stdio.h> 2 3int main(){ 4 int x, y; 5 char text1[256]; 6 char text2[256]; 7 char text3[256]; 8 char str1 = '*'; 9 char *str2= "\n"; 10 11 for(x=0;x<1; x++){ 12 for(y=0;y<10; y++){ 13 sprintf(text1, "%c", str1); 14 } 15 sprintf(text2, "%s", str2); 16 } 17 sprintf(text3, "%c%s", text1, text2); 18 printf(text3); 19 20 return 0; 21}

『表示したいもの』
**********

試したこと

私の書式が間違っているため、検索等してみましたが解決できませんでした。

補足情報(FW/ツールのバージョンなど)

MacOS Big Sur 
terminal zsh バージョン2.11  
gcc -v Homebrew GCC 11.1.0_1 
vs code for Mac 1.57.1

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

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

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

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

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

guest

回答6

0

ベストアンサー

sprintf を使うという条件なんですね。
元のコードをできるだけ活かしたものにしてみました。

C

1#include <stdio.h> 2 3int main(void) 4{ 5 int x, y; 6 char text1[256]; 7 char text2[256]; 8 char text3[256]; 9 char str1 = '*'; 10 char *str2 = "\n"; 11 12 for (x = 0; x < 1; x++) { 13 for (y = 0; y < 10; y++) { 14 sprintf(text1 + y, "%c", str1); // ★ '*' を入れる場所を変更 15 } 16 sprintf(text2, "%s", str2); 17 sprintf(text3, "%s%s", text1, text2); // ★ text1 は文字列だから "%s" 18 printf(text3); 19 } // ★ for の範囲を変更。x < 3 にすると 3x10 の '*' になる 20 21 return 0; 22}

追記
sprintf にこだわらなければ簡単です。

1文字ずつ出力すると、

C

1#include <stdio.h> // putchar 2 3void draw(int x, int y) 4{ 5 for (int i = 0; i < x; i++) { 6 for (int j = 0; j < y; j++) putchar('*'); 7 putchar('\n'); 8 } 9} 10 11int main(void) { draw(3, 10); }

行単位で出力すると、

C

1#include <stdio.h> // puts 2#include <string.h> // memset 3 4void draw(int x, int y) 5{ 6 char text[256]; // 可変長配列が使えるバージョンの C なら、char text[y+1]; 7 memset(text, '*', y); // for (int i = 0; i < y; i++) text[i] = '*'; 8 text[y] = '\0'; 9 while (--x >= 0) puts(text); // printf("%s\n", text) 10} 11 12int main(void) { draw(3, 10); }

投稿2021/08/15 10:07

編集2021/08/16 03:24
kazuma-s

総合スコア8224

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

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

退会済みユーザー

退会済みユーザー

2021/08/15 13:26

こんばんは ご回答が有難うございます。 c言語初学者なため、自分自身でお題を作って勉強しています。 そのため、的外れな問題だったかもしれません。 そもそも今回、私がやりたかった事に、sprintf縛りというのは無理があったのでしょうか?
kazuma-s

2021/08/15 13:48

回答のコードは試していないのですか? sprintf縛りで出来ているでしょう。 効率は良くないけど、動くはずです。
退会済みユーザー

退会済みユーザー

2021/08/15 14:44

もちろん実行させて頂きました。 その上で、sprintf縛りだとかなりコードが長くなってしまう印象を受けたので、今回私がやりたかった事には適切なコードではないと思い、質問させて頂きました。 〉効率は良くないけど、動くはず。 まさにその通りだと思います。丁寧な回答ありがとうございました。
dodox86

2021/08/16 04:18

@質問者さん 質問を読むと、前提として「sprintf縛り」に思えますよ。だから回答者の皆さん、その縛りで回答されています。
fana

2021/08/16 04:36

配列の要素をふつーにいじくらずにあえて sprintf の %c で1文字ずつ突っ込むコード! なんてのを見せられたら,そりゃ誰だって「わざと/あえて」やっていると受け取りますよね.
jimbe

2021/08/16 07:37

「'*'を10個並べて表示するCプログラム選手権」を募集したらどれくらい来ますかね ^^
guest

0

sprintf で追加の効果を得るのでしたら

c

1sprintf(text1, "%s%c", text1, str1);

というふうに、最初に自身を書くことになるかと思います。


単に '*' を 10 個並べたものを表示する、ということであれば、もちろん簡単なのは

c

1printf("**********");

ですよね。
いや、任意の数だけ並べる感じで…となれば

c

1for(int i=0;i<10;i++) printf("*");

となります。
いやいや、変数に10個並べたのを用意してそれを表示するようなのが…でしたら

c

1for(int i=0;i<10;i++) text1[i]='*'; 2text1[10]='\0'; 3printf(text1);

ポインタで

c

1char *p=text1; 2for(int i=0;i<10;i++) *p++='*'; 3*p='\0'; 4printf(text1);

いっそ関数で

c

1memset(text1,'*',10); 2text1[10]='\0'; 3printf(text1);

もあり得ます。
文字列を追加していく風?なら

c

1text1[0]='\0'; 2for(int i=0;i<10;i++) strcat(text1,"*"); 3printf(text1);

というのも有りでしょうか。
実装依存かもしれませんが

c

1strcpy(text1,"*"); 2strncat(text1,text1,10-1); 3printf(text1);

も動くかもしれません。

投稿2021/08/15 10:03

編集2021/08/15 16:11
jimbe

総合スコア13209

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

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

退会済みユーザー

退会済みユーザー

2021/08/16 10:26

こんばんは ご回答有難うございます。 丁寧かつ、複数のパターンを出して頂き、大変勉強になりました。 有り難うございました。
guest

0

sprintf を使って * を並べる……最も明快な方法は,
sprintf( text3, "%c%c%c%s", str1, str1, str1, str2 );
みたいな形でしょう.
この例だと3個になりますが,10個にするならそうなるように %cstr1 を頑張って書き並べればよいですね.

質問文記載のコードを見ると text1, text2 という2つのバッファが存在しているので,これを利用すれば,ほんの少しだけマシ(?)になるかもしれません.

C

1sprintf( text1, "%c%c\0", str1, str1 ); //2個 2sprintf( text2, "%s%s", text1, text1 ); //4個 3sprintf( text3, "%s%s%s%s", text2, text2, text1, str2 ); //10個+改行

投稿2021/08/16 01:52

fana

総合スコア11996

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

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

fana

2021/08/16 02:02

「%c を複数並べるのはダメです」とかいう場合には,「2個=1個+1個」という操作で2個を作れば良いでしょう. (目的の個数を半分ずつにでも分割していくようなのを作ってみれば良いんじゃないですかね.)
退会済みユーザー

退会済みユーザー

2021/08/16 10:27

こんばんは ご回答有難うございます。 大変勉強になりました。
guest

0

C

1char* p = text1; 2for(y = 0; y < 10; y++){ 3 p += sprintf(p, "%c", str1); 4}

スマートではないですが、こういうのもあります。

投稿2021/08/15 15:06

majiponi

総合スコア1722

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

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

thkana

2021/08/15 21:57

printf系の関数は出力した文字数(それともバイト数だっけ?)を返している、というのを知らないと何をしているのか理解できないかもですね。
退会済みユーザー

退会済みユーザー

2021/08/16 10:30

こんばんは ご回答有難うございます。 自分の中で落とし込むまでに時間がかかりそうですが、大変勉強になりました。 有り難うございました。
guest

0

私の書式が間違っているため、検索等してみましたが解決できませんでした。

検索すると言うより、考える話です。考えましょう。

C

1 for(y=0;y<10; y++){ 2 sprintf(text1, "%c", str1); 3 }

text1*1文字だけ入れるという同じ事を10回繰り返しているだけなので、1回実行しようが100回実行しようが、結果は同じで、1文字だけ入ります。

C

1 sprintf(text3, "%c%s", text1, text2);

text1は文字列なので、%cじゃなくて%sですね。

text1の中に*を10個入れるのであれば、

C

1 for(y=0;y<10; y++){ 2 text1[y] = str1; 3 } 4 text[y] = '\0';

でしょうか。

投稿2021/08/15 10:07

otn

総合スコア85901

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

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

退会済みユーザー

退会済みユーザー

2021/08/15 13:35

こんばんは ご回答が有難うございます。 仮に10×10の*を配置する場合どのように考えればいいのでしょうか。 text1の中に100個の*を入れると考えるのか 追加の質問になってしまいますが、ご教授いただきたいです。 よろしく御願い致します。
otn

2021/08/15 14:43

どっちでも良いです。 ・text1の中に、「10の*と改行」の10回繰り返しを入れて、それを1回出力する ・text1の中に、「10の*と改行」を1つ入れて、それを10回出力する
退会済みユーザー

退会済みユーザー

2021/08/16 10:28

有り難うございました。
guest

0

sprintfを使うのが間違ってます

C

1 for(y=0;y<10; y++){ 2 text1[y]=str1; 3 } 4 text1[y]='\0';

投稿2021/08/15 09:50

y_waiwai

総合スコア88042

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

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

退会済みユーザー

退会済みユーザー

2021/08/16 10:28

こんばんは ご回答有難うございます。 大変勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問