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

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

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

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

2131閲覧

strcatを使わず、1つの配列に文字列を追加する方法

herosportio

総合スコア2

C

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/10/06 08:02

編集2020/10/06 11:43

#####やりたい事
・strcatを使わず1つの配列に繰り返し数分文字列を追加していくというロジックを実装したい。
ex)
表示回数:3
入力:[hellow!]
出力結果:[hellow! hellow! hellow!]

#####プログラムコード

C

1#include <stdio.h> 2#include <string.h> 3#include <ctype.h> 4int main(void){ 5 int num; 6 char str[1000]; 7 char buf[1000] = "hellow! "; 8 fgets(str,sizeof(str),stdin); 9 sscanf(num,"%d",str); 10 11 for(int i = 0; i < num; i++){ 12 /*ここのロジックが不明*/ 13 } 14} 15

※スペースを代入するロジックは未実装です。
#####不明点
・配列に配列を代入するができない
->str += bufは受け付けなかった。

#####補足
実装したかった挙動は、"for文を回した分単語を表示、単語間にはスペースを入れる"という物でstrcatを使う事で実装できた。

C

1#include <stdio.h> 2#include <string.h> 3 4#define ARRAY_SIZE (10) 5 6int main(void) 7{ 8 char str[ARRAY_SIZE] = "Hello!"; 9 char buf[1000]; 10 int num; 11 12 fgets(buf,sizeof(buf),stdin); 13 sscanf(buf,"%d",&num); 14 15 for( int i = 1; i < num; i++) 16 strcat(str, " Hellow!"); 17 18 puts(str); 19 20 return 0; 21}

######お詫び
この度、私の誤解を招くような表現により多数の方々に混乱を生じさせてしまいました。
ご迷惑をおかけして申し訳ありませんでした。
よろしくお願いします。

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

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

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

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

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

dodox86

2020/10/06 08:32

> Googleで"C言語 配列 文字列 代入"等で検索をかけた結果、for文を用いて配列に単語を追加していくという事をしている物が見当たらなかった こういうピンポイント過ぎるものは検索かけても見つからないです。自分で考えるしかないか考えた方が早い。編集後の質問を見ますと、strcatで連結させているように見え、とりあえず解決したように思いますが、あと何が問題として残っているのでしょうか。
herosportio

2020/10/06 08:45

>>Daregada はい、ご指摘の通りそちらのコピペです C言語にtrim関数が無いとのことだったので関数自作という表現をしましたが何か問題がありましたでしょうか? >>dodox86 "1つの配列に文字列をforループ分追加していく"という点が残りの疑問点になります。 一番最初に考えたロジックが実装可能か不可なのかハッキリさせたく。 よろしくお願いします。
Zuishin

2020/10/06 09:10 編集

> C言語にtrim関数が無いとのことだったので関数自作という表現をしましたが何か問題がありましたでしょうか? 自分の物でないものを自分の物と言うことに何の問題もないという感覚は泥棒かジャイアンです。他人の作った物は他人の知的財産であり、決して自作ではありません。 他人のコードを使う時は入手先をきちんと表示し、著作権の所有者を明らかにしてください。
dodox86

2020/10/06 10:13

>@質問者さん Zuishinさんの指摘に加えて、一般的に「自作」と言われるとご自身で作られたものを想定します。このような場では特に、です。事実私もそう思いました。その線で考えるとご提示のTrim()関数を自作できる力と理解があってなぜ質問のような疑問が出てくるのか回答者側は不思議に思ってしまいます。 > "1つの配列に文字列をforループ分追加していく"という点が残りの疑問点になります。 とのとですが、編集後のコード for( int i = 1; i < num; i++) strcat(str, " Hellow!"); がそれ相当ではないのでしょうか。これをご自分で書かれて尚、疑問に思われているようですので、私自身、回答しあぐねたのが正直なところです。 (実際にはstrは char str[ARRAY_SIZE] でARRAY_SIZE=10なので、配列のサイズを超えた書き込みとなり、領域を破壊します)
PingHermit

2020/10/06 10:22 編集

Zuishin さんはちょっとやんわりと書いていますが、 他者の著作物の引用は、公開されている場合は、 引用元を明らかにしていないところと、 あたかも自分で書いたように偽証したことは、 著作権法違反です。
herosportio

2020/10/06 10:32

>>Zuishin 日本語の問題はこれ以上回答しませんが、私が引用コードの著作権を主張していたら大問題ですが、ここでは"未実装の関数を自分で実装する"という観点上"自作"という表現で問題ないように思えます。 本来他人に見せるコードではなく配列に関する自己学習用だった為引用コードまで気が回らなく貴方の様にニュアンスを読み取っていただけない方が居る事を考慮していなかったのは、私の落ち度であり反省する点であります。後ほど引用したコードについては記載方法を確認の上提示致します。 よろしくお願いします。
Zuishin

2020/10/06 10:35

問題があります。あなたの自作ではありません。自作という言葉を間違えているのでしょうが、それは致命的な間違いです。
Daregada

2020/10/06 10:37

この場合、問題がないかを判断するのは、コードを盗用・剽窃したあなたではないのでは。
Zuishin

2020/10/06 11:12 編集

> 自作という表現に関して”未実装の物を自分で実装する"という観点から自作という表現をしており、コードの著作権を主張する物ではありません。 繰り返すが、それは「自作」ではない。自国語ではなく日本語を使え。
herosportio

2020/10/06 11:26

下記内容で記事を修正します。 ・trim関数に関する記述の削除 ->strcatを使わずに配列に文字列を入れ続けるという内容で代替が聞くため >>Zuishin 私はあなたにがっかりしています。 貴方の指摘は問題解決に何も役に立っていません。 指摘は結構ですが、代替の熟語を提案する、私の修正の様にtrim関数の記載を消す等提案していただければお互いもっと労力を使わずに解決できたのではないでしょうか?非常に残念です。
Zuishin

2020/10/06 11:33 編集

個人的な問題の解決が最優先の意味が分からない。他人の物を自作と言い張るのは泥棒。
Zuishin

2020/10/06 11:33

さっさと書き直せばお互い労力を使わないのは歴然。 書き直せ。
Zuishin

2020/10/06 11:35

以上のことを日本語に翻訳すると、お互い解決のために全力を尽くそうという表現になります。
herosportio

2020/10/06 11:49

>>Zuishin 今このコメント欄で問題になっているは私の自作という表現に関してではないでしょうか? >>個人的な問題の解決が最優先の意味が分からない。 私も意味が分かりません。私の日本語が不自由で不快な思いをさせたのは謝罪致しますが、落ち着いて文章をもっと読んでいただきたいです。
Zuishin

2020/10/06 11:54

まだ言うか。
Zuishin

2020/10/06 11:55

意味が分かりません。落ち着いて文章をもっと読んでください。 という意味です。
guest

回答3

0

1つの配列に繰り返し数分文字列を追加していくというロジックを実装したかったが、可能なのでしょうか?

通常、そのような場合は、strcatを使用して実装するのが一般的です。
どうしても、全て自前でやりたいということであれば、自前のstrcatを作成し(機能はstrcatと同じ)、それを呼び出してはいかがでしょうか。

投稿2020/10/06 10:00

tatsu99

総合スコア5438

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

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

herosportio

2020/10/06 11:54

回答ありがとうございます。 通常はstrcatを用いて実装するんですね、大変参考になりました。 最初に「単語の終わりに余分なスペース入力があるから消さないといけない」と思い難しいことを実装しようとしていました。 ありがとうございました。
guest

0

ベストアンサー

  1. 文字列の後端を算出
  2. そこへ文字列コピー

ってのをまず実装しましょう

投稿2020/10/06 08:18

y_waiwai

総合スコア87747

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

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

herosportio

2020/10/06 12:04

回答ありがとうございます。 指摘して頂いた内容を元に修正した所、複雑ではありますが私が最初に思い浮かべたロジックを忠実に再現できそうです。大変助かりました。 ありがとうございます。
guest

0

C

1#include <stdio.h> // scanf, puts, sprintf 2#include <string.h> // strchr 3 4int main() 5{ 6 int num; 7 if (scanf("%d", &num) != 1 || num < 1 || num > 125) return 1; 8 char str[1000] = "Hellow!"; 9 for (char *p = strchr(str, 0); --num; p += sprintf(p, " Hellow!")) ; 10 puts(str); 11}

解説がほしければコメントください。

投稿2020/10/06 16:18

編集2020/10/06 16:22
kazuma-s

総合スコア8224

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問