dポイントプレゼントキャンペーン実施中!

次の問題のプログラムを書いたのですがどう試行錯誤しても
ndefined first referenced
symbol in file
strcp /var/tmp//ccWRo3Ic.o
ld: fatal: symbol referencing errors
collect2: ld returned 1 exit status
こんなエラーができてしまいます。
どこがまちがっているか教えてださい。おねがいします。
また、エラーのところ以外でも改善点があれば書いてください。おねがいします。

コマンドラインから複数の文字列が入力されたとき、その文字列から数字を取り除いた文字列を表示するプログラムを、以下の方針に基づいて作成せよ。

1文字列毎にその都度メモリを動的に確保し、そこに文字列をコピーし、 処理を行う。なお、一つの文字列に対  して確保する領域は一つだけとする (その際確保するバイト数に注意せよ。Lec 4-11〜を参照)
2元の文字列から数字を取り除く処理は、関数int delnum(char *) を作成し、使用する。この関数の仕様は以  下の通りとする
3 文字配列を受け取り、入っている文字列から数字を取り除き、前に詰めた文字列をその文字配列に入れ   直す
4 戻り値は数字を取り除いた文字列の長さ(ヌル文字を含まない文字数)とする
5処理後の文字列の表示は main 関数の中で行うものとする
6表示の際、処理前と処理後の文字列の長さもあわせて表示する(実行例で括弧内に表示されている数値が  文字列の長さである)
7確保したメモリは次の文字列を処理する前に解放する

「プログラミングのエラーについて」の質問画像

A 回答 (6件)

>ndefined first referenced


>symbol in file
>strcp /var/tmp//ccWRo3Ic.o

既に回答ありますが、stecpって関数が無いからリンクできねーよ。
と言われています。

>文字列毎にその都度メモリを動的に確保し、そこに文字列をコピーし、 処理を行う。

動的確保してないので減点1です。

>文字配列を受け取り、入っている文字列から数字を取り除き、前に詰めた文字列をその文字配列に入れ   直す

実行確認はしていませんが…数字の後の文字が2つ続くんじゃないですかね?
delnum()内のループ処理中のiがどのように変化していくのか確認した方がいいでしょう。

>処理後の文字列の表示は main 関数の中で行うものとする

処理後の文字列参照していませんから、どちらもargv[i]が表示されます。
減点1。

>表示の際、処理前と処理後の文字列の長さもあわせて表示する

渡した文字列の最後が数字だった。という場合以外は同じ長さになると思われます。
よって、減点1。

>確保したメモリは次の文字列を処理する前に解放する

そもそも動的確保していないので解放できません。
が、メモリリークはしていないので、まぁ次第点かと。
要求仕様満たしていないので納品拒否ですが。
# コマンドラインで100文字越えの文字列を渡されたら処理できません。
    • good
    • 0
この回答へのお礼

解答ありがとうございました‼

お礼日時:2016/11/23 11:29

言語とかコンパイラとかの情報を書いてください。


また、画像で書かれてもよく読めないし、こちらでコンパイルして確認することもできません。


メッセージから、C言語をgccでコンパイルしているものと仮定します。


「strcp」というシンボルが無い、というリンカからのエラーです。
・strcp を定義していない。
・strcp が入ってるファイルを指定していない
・スペルミス。 使いたいのは srrcp ではない
のいずれかです。



C言語で実行ファイルができるまでには、大きく
・プリプロセス(前処理)
・コンパイル
・リンク
の3段階があります。

詳細は「C言語 分割コンパイル」で検索してみてください。

「分割コンパイル」していないつもりでも、普段から「分割コンパイル」をやっています。
例えば、 printf は「C言語」ではありません。
あなたが delnum 関数を作ったのと同じように、「誰かが作った関数」です。
「C標準ライブラリ」に「printfを含むオブジェクト」が含まれています。
gccでリンクするときに、このC標準ライブラリを自動でリンクするので、分割コンパイルを意識しないだけです。


リンク時に、シンボルに対して、その実体となるオブジェクトが無いとエラーになります。
今出てるエラーはこれです。



C言語では、関数や変数は使う前に宣言するのが原則です。
ですが、歴史的な経緯で「宣言されていない関数が使われていたら、とりあえず 引数任意、戻り値intの関数だとしてコンパイルを進める」という「暗黙の関数宣言」というものがあります。
gccでは警告になります。
 warning: implicit declaration of function "strcp"
とか言う感じのメッセージが出てないですか?
警告はエラーではないので、コンパイル自体は止まりません。

うまい具合に「暗黙の宣言」と同じものがあると、実行ファイルまでできてしまいます。
/* ただし、引数と戻り値が一致していない場合、誤動作することがあります */
例えば、 #include <stdio.h>が無くても、 printf を使うことができます。

ですが、「暗黙の宣言」と矛盾する宣言(例えば、戻り値がdouble)があればそこでコンパイルエラーになります。
また、実体が無ければ、リンク時にエラーになります。


リンカエラーで多いのが
・ソースコードでスペルミス
→暗黙の関数宣言でそのままコンパイルできる
→リンク時にシンボルが無いのでエラー
というものです。
    • good
    • 0
この回答へのお礼

解答ありがとうございました‼

お礼日時:2016/11/23 11:30

>既に回答ありますが、stecpって関数が無いからリンクできねーよ。


と言われています。

strcp…です。
    • good
    • 0
この回答へのお礼

解答ありがとうございました‼

お礼日時:2016/11/23 11:26

countの変数を、ループ開始時に毎回初期化した方がよいのではないでしょうか。


ループ二回目には、一回目の文字列が残っていますよね。
ヌル終端となるように毎回初期化するものではないですか。
    • good
    • 0
この回答へのお礼

なるほど!
解答ありがとうございました‼

お礼日時:2016/11/23 11:27

strcp は strcpyの間違いのように見えます。

    • good
    • 1
この回答へのお礼

うっかりしてました
解答ありがとうございました‼

お礼日時:2016/11/23 11:25

すみません。

お手数かとは思いますが、そのままコピーして、ここへ張り付けて頂けませんでしょうか。
コピー&ペーストすると、このサイトは複数の空白を1つにまとめるため、インデントの表示が乱れますが
それは気にしないでください。そうすれば、こちらでも、そのプログラムをコピーして、同じことが再現できますので、回答しやすくなります。
あと、念の為、OS(winndowsかLinuxか等)とコンパイラ(gccかvisual c++か等)も提示しておいたほうが良いでしょう。
    • good
    • 0
この回答へのお礼

そうですよね、夜中なので頭がそこまで回ってませんでした
わざわざ解答ありがとうございました‼

お礼日時:2016/11/23 11:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!