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

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

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

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

プログラミング言語

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1370閲覧

2つの文字列の文字数の合計を出力する

Global4996

総合スコア1

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

プログラミング言語

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/12/04 07:46

編集2021/12/04 07:53

前提・実現したいこと

文字配列a,bの先頭アドレスを受け取り、2つの文字数の合計を返却値で返す関数を作成したいです。「関数内では、ポインタのインクリメントを繰り返す方法を用い、構造体、添え字[]は用いない」という条件が付いています。

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

1>C:\Users\fit-user\Desktop\test\test.c(4,8): warning C4013: 関数 'strcat' は定義されていません。int 型の値を返す外部関数と見なします。 1>C:\Users\fit-user\Desktop\test\test.c(13,9): warning C4477: 'printf' : 書式文字列 '%s' には、型 'char *' の引数が必要ですが、可変個引数 1 は型 'int (__cdecl *)(char *,char *)' です 1>C:\Users\fit-user\Desktop\test\test.c(11,1): warning C4047: '初期化中': 間接参照のレベルが 'char' と 'char [6]' で異なっています。 1>C:\Users\fit-user\Desktop\test\test.c(12,1): warning C4047: '初期化中': 間接参照のレベルが 'char' と 'char [4]' で異なっています。

該当のソースコード

c+

1int count(char *a,char *b) { 2 int i, count = 0; 3 strcat(a, b); 4 for (i = 0; a = "\0"; i++) { 5 count++; 6 } 7 return(count); 8} 9int main(void) { 10 char x = { "hello" }; 11 char y = { "usa" }; 12 printf("mojisuu=%s", count); 13 return(0); 14}

試したこと

参考書などを見直したのですがやり方がよくわからなかったです。

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

大学でc言語について学習しています。最近始めたばかりでわからないところが多々あります。今後のためにもどこが間違っていてどうしたら改善できるのか教えていただけると嬉しいです。間違っていた部分を重点的に復習していきます。
ちなみに使っているのは、visualstdio2019です。

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

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

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

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

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

cx20

2021/12/04 08:18 編集

参考にされた参考書を教えて頂けますか?
Global4996

2021/12/04 08:20

「新・明解c言語 入門編」ていう参考書です。
cx20

2021/12/04 08:56

参考書の提示、ありがとうございます。 参考書はかなり丁寧に書かれているようなので、悪くは無さそうに思いました。 演習問題が付いているかと思いますので、最初から1つずつこなしていくことをお勧めします。
cx20

2021/12/04 09:36

目次レベルだと 第9章 文字列の基本 第11章 文字列とポインタ あたりを復習すると良いと思います。
Global4996

2021/12/04 11:27

貴重なお言葉ありがとうごさまいます。確かにまだ基本的なところがわかっていないと気づいたので提示していただいた項目の復習をがんばります。ありがとうございました!
guest

回答2

0

2つの文字数の合計を返却値で返す関数

これをどう実現しようと考えましたか? 多分、strcat()を使ってと思いますが、 strcat()関数が何をする関数で、どう使うのか、をまず確認しましょう。
....なんですが、わざわざ、文字列をつなげる必要はなく、別個に数えて加えても良いのでは?

for (i = 0; a = "\0"; i++) {

警告が出ないのが不思議。 特に、a = "\0"; これでは、aに 文字列 "\0"を代入 ... ではなく、"\0"のポインタを代入となります。多分、C言語での文字の扱いが分かってないのでは? と思います。文字列の終わりが 0で終わる事が分かってるなら、a != '\0'; .... と思ったが、この for()は、こんな感じ? (意味、分かりますか?)

C

1 for (; *a != '\0'; a++) count++; 2 for (; *b != '\0'; b++) count++;

warning C4047: '初期化中': 間接参照のレベルが 'char' と 'char [6]' で異なっています。

となります。x は、charなので、1文字(半角英数1文字)しか入りません。文字列にするならば、配列とし、 char x[6] = { "hello" };のようにすべき。

次の警告、

warning C4477: 'printf' : 書式文字列 '%s' には、

関数printf()の仕様を調べましょう。
printf("mojisuu=%s", count);%s に対応するのが、countです。 %sは引数に文字列がある事を示します。ではcountは何? コンパラは関数名と判断したようです。 関数名は文字列でないので不適切。 また、関数としたいならば、count(x, y)のように引数も付けるべきです。
ただし、この関数の戻り値は、intなので、%sに一致しません。 %d とすべきでしょう。

投稿2021/12/04 09:14

pepperleaf

総合スコア6385

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

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

Global4996

2021/12/04 09:19

なるほど!警告の意味がわかっていなかったので警告ごとの改善方法を教えてくださったのはとても勉強になりました。ありがとうございました!
cx20

2021/12/04 10:31

> char x[6] = { "hello" }; 波カッコはいらないかなと思いましたが、この書き方でもエラーにはならないのですね。少し気になって調べてみました。 <参考> ■ 「それを波括弧で囲んでもよい」は何の意味があるのか? https://teratail.com/questions/92502
pepperleaf

2021/12/05 01:08

確かに、、波カッコはいらなかった。コンパイル通ったので、気にしなかったけど。 他にも細々とありそうなで、これからも大変かと思った方が先。
guest

0

ベストアンサー

warning C4013: 関数 'strcat()' は定義されていません。int 型の値を返す外部関数と見なします。

この警告は関数が見つからない場合に表示されます。strcat()string.h に含まれている為、

C

1#include <string.h>

とすれば、警告は消えるかと思います。(ただ、今回の文字数をカウントするだけの場合であれば strcat も使う必要はありません。)

warning C4477: 'printf' : 書式文字列 '%s' には、型 'char *'~

printf("mojisuu=%s", count);

printf()%s は「文字列」を指定する場合の書式になります。
文字数を表示したいのであれば %d を使ってください。

C

1printf("mojisuu=%d", count); 2

warning C4047: '初期化中': 間接参照のレベルが 'char' と 'char [6]' で異なっていま

「文字」と「文字列」の区別の理解が足りていないように思います。

char x = { "hello" };

1文字だけが格納できる変数に「文字列」 を代入しようとして警告が出ています。文字列として書くとしたら、以下になります。

C

1char x[] = "hello"; 2// 文字列の初期化は以下の方法でも可能です。「"」でなく「'」が使われていることに注意ください。 3// char x[] = {'h', 'e', 'l', 'l', 'o', '\0'};

strcat(a, b);

今回は strcat() は不要です。

for (i = 0; a = "\0"; i++) {

これは恐らく NULL 終端かどうかのチェックを使用としているのだと思いますが、これだと代入になってしまいます。書くとしたら、

C

1for (i = 0; *a != '\0'; i++) {

といった感じでしょうか。というか i 使ってませんね。。

C

1for (; *a != '\0'; a++) {

で良さそうです。

以下は上記の指摘を元に、修正した結果になります。

C

1#include <stdio.h> 2 3int count(char *a,char *b) { 4 int count = 0; 5 for (; *a != '\0'; a++) { 6 count++; // 文字数のカウントアップ 7 } 8 for (; *b != '\0'; b++) { 9 count++; // 文字数のカウントアップ 10 } 11 return count; 12} 13 14int main(void) { 15 char a[] = "hello"; 16 char b[] = "usa"; 17 // 文字列の初期化は以下の方法でも可能です。「"」でなく「'」が使われていることに注意ください。 18 // char a[] = {'h', 'e', 'l', 'l', 'o', '\0'}; 19 // char b[] = {'u', 's', 'a', '\0'}; 20 21 int mojisuu = count(a, b); 22 printf("mojisuu=%d\n", mojisuu); 23 return 0; 24}

投稿2021/12/04 08:52

編集2021/12/04 09:27
cx20

総合スコア4648

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

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

Global4996

2021/12/04 09:20

NULL文字の使い方が間違えていたんですね。解決できました!
cx20

2021/12/05 15:49

解決できたようで何よりです。 ただ、今回、間違えている箇所はNULL文字の箇所以外にも多く見受けられました。(C言語を殆ど理解していないのでは?と不安に感じました。) 他の学習で忙しいかと思いますが、正しく理解しないと後で困ると思いますので、再度、参考書を初めからやり直すことをお勧めします。 <今回気になった点> ・#include の指定が無い ・今回のケースでは変数「i」は不要 ・今回のケースでは strcat() も不要 ・NULL 文字の判定の仕方が誤っている ・文字列の初期化が誤っている ・printf の書式が誤っている ・count() 関数の戻り値を取得していない
Global4996

2021/12/07 08:19

確かにnull文字以外にも多くの間違いがありますね。もう一度参考書を1から復習したいと思います。貴重なお言葉ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問