🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

Q&A

解決済

4回答

1685閲覧

C言語 ポインタを使って文字列を別の文字列に追加したいです。

misa_san

総合スコア1

C

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

0グッド

0クリップ

投稿2021/03/13 16:11

前提・実現したいこと

プログラミング初学者です。課題で文字列に文字列を追加するという課題があります。ポインタを利用して文字列に文字列を追加しようとしたのですが現状何も出力されない状態が続いています。問題点を指摘いただけたらありがたいです。

ちなみに調べたところstrcatなどの関数があるようですが、今回は関数名は指定されているのでそちらは使えないです。お手数ですがどうぞよろしくお願いします。それと#使うと文字が大きくなってしまったのでincludeの前の#は省略してあります。

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

エラー自体は特になしですが何も出力されません。関数の呼び出し方が違うのでしょうか…?

該当のソースコード

include <stdio.h>
void addChar(char *str,char *str2){

int i; unsigned long num = sizeof(str) / sizeof(str[0]); for(i = 0;str2[i] != '\0';i++){ str[i + num] = str2[i]; } printf("%c",*str);

}

int main(int argc, const char * argv[]){
char *str = "HELLO";
char *str2 = "WORLD";
addChar(str,str2);

return 0;

}

試したこと

ネットで調べましたがstrcatなどの関数を使用した方法は出てきましたが使わない方法はわかりませんでした。

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

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

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

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

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

hoshi-takanori

2021/03/13 17:30

まず課題をしっかり確認して欲しいのですが、str が指す先の文字列に str2 の内容を追加して破壊的変更を行う必要があるのでしょうか? また、addChar の中で出力も行うのでしょうか? (addChar で出力を行うなら破壊的変更は不要だと思うので…。)
misa_san

2021/03/13 23:05

わかりづらくて申し訳ありません、addchar関数の中身は「strの末尾にstr2の文字列を追加する」です。出力までは求められていません。
guest

回答4

0

解決済みですが

こういう処理でオススメなのはsprintf関数(とこの派生系)です。strcat禁止なので、これも禁止かもしれませんが。

大抵の場合、printf関数を最初に学んでいるはずでしょうから、printfの画面出力を変数格納にするだけなので使い方が簡単です。

投稿2021/03/14 10:58

HogeAnimalLover

総合スコア4830

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

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

0

ベストアンサー

C

1#include <stdio.h> 2 3void addChar(char *str,char *str2){ 4 int i; 5 int num; 6 7 // str の末尾位置をnumに求める 8 for ( num = 0; str[num] != '\0'; num++) {} 9 10 // strにstr2のナカミを追加する 11 for( i = 0; str2[i] != '\0'; i++) { 12 str[i + num] = str2[i]; 13 } 14 15} 16 17int main(int argc, const char * argv[]){ 18 char str[16] = "HELLO"; // 十分な領域を用意すべし 19 char str2[] = "WORLD"; 20 addChar(str,str2); 21 printf("[%s]\n", str); 22 return 0; 23}

投稿2021/03/13 23:15

episteme

総合スコア16612

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

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

misa_san

2021/03/13 23:43

コード及び丁寧にコメントまでつけてのご回答ありがとうございます。良くないと思いつつも丸写ししたらできました…。自分がまず何を理解できていなかったのかを改めて確認しつつ、学習に励みたいと思います。
guest

0

char *str = "HELLO";
char *str2 = "WORLD";

上記のような“文字列リテラル”は、書き換え不可です。
結合用には、別の配列を用意しましょう。
参考:ポインタと文字列→「文字列のポインタのデメリット」

投稿2021/03/13 17:47

編集2021/03/13 17:53
cateye

総合スコア6851

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

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

misa_san

2021/03/13 23:38

参考URLまで貼り付けていただきありがとうございます。理解できました…。
guest

0

sizeof(str) / sizeof(str[0])

これは、strが配列の時に配列要素数を求める式ですが、strは配列じゃなくてポインターだし、そもそも配列だったとしても配列サイズを求めても何の意味も無いです。

numには、「strから何番目に'\0'があるか」という番号を入れれば良いでしょう。
関数を使うとstrlen(str)ですが、自分でやるなら、その下の継ぎ足しのforと似たようなことをやれば良いです。

投稿2021/03/13 17:24

otn

総合スコア85890

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

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

misa_san

2021/03/13 23:40

ご回答いただきありがとうございます。確かに配列ではないですね…。 自分のコードだと他にも多々問題点ありましたが、otn様のおっしゃる通りfor文で出来ました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問