![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
次の問題のプログラムを書いたのですがどう試行錯誤しても
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確保したメモリは次の文字列を処理する前に解放する
![「プログラミングのエラーについて」の質問画像](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/d/542449399_58349734b5708/M.jpg)
No.4ベストアンサー
- 回答日時:
>ndefined first referenced
>symbol in file
>strcp /var/tmp//ccWRo3Ic.o
既に回答ありますが、stecpって関数が無いからリンクできねーよ。
と言われています。
>文字列毎にその都度メモリを動的に確保し、そこに文字列をコピーし、 処理を行う。
動的確保してないので減点1です。
>文字配列を受け取り、入っている文字列から数字を取り除き、前に詰めた文字列をその文字配列に入れ 直す
実行確認はしていませんが…数字の後の文字が2つ続くんじゃないですかね?
delnum()内のループ処理中のiがどのように変化していくのか確認した方がいいでしょう。
>処理後の文字列の表示は main 関数の中で行うものとする
処理後の文字列参照していませんから、どちらもargv[i]が表示されます。
減点1。
>表示の際、処理前と処理後の文字列の長さもあわせて表示する
渡した文字列の最後が数字だった。という場合以外は同じ長さになると思われます。
よって、減点1。
>確保したメモリは次の文字列を処理する前に解放する
そもそも動的確保していないので解放できません。
が、メモリリークはしていないので、まぁ次第点かと。
要求仕様満たしていないので納品拒否ですが。
# コマンドラインで100文字越えの文字列を渡されたら処理できません。
No.6
- 回答日時:
言語とかコンパイラとかの情報を書いてください。
また、画像で書かれてもよく読めないし、こちらでコンパイルして確認することもできません。
メッセージから、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)があればそこでコンパイルエラーになります。
また、実体が無ければ、リンク時にエラーになります。
リンカエラーで多いのが
・ソースコードでスペルミス
→暗黙の関数宣言でそのままコンパイルできる
→リンク時にシンボルが無いのでエラー
というものです。
No.5
- 回答日時:
>既に回答ありますが、stecpって関数が無いからリンクできねーよ。
と言われています。
strcp…です。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?5a7ff87)
No.1
- 回答日時:
すみません。
お手数かとは思いますが、そのままコピーして、ここへ張り付けて頂けませんでしょうか。コピー&ペーストすると、このサイトは複数の空白を1つにまとめるため、インデントの表示が乱れますが
それは気にしないでください。そうすれば、こちらでも、そのプログラムをコピーして、同じことが再現できますので、回答しやすくなります。
あと、念の為、OS(winndowsかLinuxか等)とコンパイラ(gccかvisual c++か等)も提示しておいたほうが良いでしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAで、特定の文字より後を削除して残った数値を文字列に変換と特定の文字より前も削除したい 3 2022/04/15 19:21
- C言語・C++・C# c言語 配列とポインタについて 3 2023/02/09 22:53
- C言語・C++・C# C言語の質問です。 以下の命令を実行するプログラムを作りました ①文字列aとbの長さを表示 ②aとb 1 2022/04/29 15:35
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- その他(プログラミング・Web制作) テキストエディタで複数行にわたる文字列の行頭に番号を振る方法 4 2023/03/11 12:57
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
- その他(プログラミング・Web制作) プログラミング pythonの問題について 2 2022/04/19 00:41
- Java Java 南京錠 2 2023/02/04 11:46
- Visual Basic(VBA) 以下のVBAで該当文字列の前後に付与したい。 例 前に付与 abc ユーザーID 12345 後に付 3 2022/04/19 21:50
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
エクセルで文字列の最大値を抽...
-
エクセルで文字列をtxtファイル...
-
VBAでの Replace関数で、ワイル...
-
MS SQLServer のSQLで文字列の...
-
VBscriptで文字サイズを指定で...
-
Msgboxの×が押されたとき
-
ORCLEでの小数の表示方法の変更...
-
VBの「As String * 128」とは?
-
Left関数とRight関数を合わせた...
-
OnTime 使用時のプロシージャへ...
-
Excelで3E8を3.00E+8にしない方...
-
Excelで指数表現しないようにす...
-
文字列からタブコードを取り除...
-
アクセスで特定の数字以外(複...
-
VBA2005 16進を2桁で表示したい。
-
C#で年月を比較する
-
16進数を10進数に簡単に変換す...
-
変数内に入った文字列の結合 UWSC
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
VBAでの Replace関数で、ワイル...
-
文字列からタブコードを取り除...
-
Excelで指数表現しないようにす...
-
Excelで3E8を3.00E+8にしない方...
-
エクセルで文字列の最大値を抽...
-
MS SQLServer のSQLで文字列の...
-
エクセルで文字列をtxtファイル...
-
Left関数とRight関数を合わせた...
-
【Excel VBA】複数ある特定の文...
-
同一セル内に関数と文字列を同...
-
VBA2005 16進を2桁で表示したい。
-
VBの「As String * 128」とは?
-
エクセル 数値データを桁をそ...
-
Msgboxの×が押されたとき
-
Excelはなんで先頭の0を消すん...
-
16進数を10進数に簡単に変換す...
-
Pro c/c++ でホスト変数の後に....
-
[C言語]fputsとfprintfの違い
おすすめ情報