その後のプログラムです。
/************************************************************
文字列を比較する関数
戻り値 : ps1 > ps21
ps1 = ps20
ps1 < ps2 -1
*************************************************************/
intstr_cmp(char *ps1,char *ps2)
/*ps1,ps2 : 比較する文字列が入った配列を指すポインタ*/
{
intkekka;/*比較結果*/
for(;*ps1 != '¥0' && *ps2 != '¥0' && *ps1 == *ps2 ;ps1++,ps2++);
if(*ps1 > *ps2)
{
kekka = 1;
}
else if(*ps1 == *ps2)
{
kekka = 0;
}
else
{
kekka = -1;
}
return kekka;
}
/*************************************************************
文字列と文字列とを交換する関数
*************************************************************/
voidstr_change(char *ps1,char *ps2)
/* ps1,ps2 : 交換する文字列が入った配列へのポインタ*/
{
chartemp[DATA_LEN]/*交換用一時保管*/
str_cpy(temp,ps1);/*複写 ps1->temp */
str_cpy(ps1,ps2);/*複写 ps2->ps1 */
str_cpy(ps2,temp);/*複写 temp->ps2 */
}
/*************************************************************
文字列を複写する関数
*************************************************************/
voidstr_cpy(char *pd,char *ps)
/* char *pd :複写される配列へのポインタ*/
/* char *ps :複写する配列へのポインタ*/
{
for(;*ps != '¥0';ps++,pd++)
{
*pd = *ps;/*1文字複写*/
}
*pd = '¥0';/*最後の1文字*/
}
これをコンパイルすると
kansuu4.c: In function ‘atr_cpy’:
kansuu4.c:18: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘main’
kansuu4.c:41: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
kansuu4.c:57: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
kansuu4.c:85: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
kansuu4.c:112: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
kansuu4.c:128: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
kansuu4.c:134: error: expected ‘{’ at end of input
と出ました。
本当は自分で努力するべきだと思います。
「自分でよく見てみろ。」
でも結構です。
ご多忙中申し訳ありません。
ご回答の程、宜しくお願い致します。
No.1ベストアンサー
- 回答日時:
「自分でよく見てみろ。
」ちなみに私の環境でコンパイルしたら、エラーが量産されました。
エラー E2451 test.cpp 19: 未定義のシンボル intkekka(関数 intstr_cmp(char *,char *) )
エラー E2451 test.cpp 29: 未定義のシンボル kekka(関数 intstr_cmp(char *,char *) )
エラー E2451 test.cpp 73: 未定義のシンボル chartemp(関数 voidstr_change(char *,char *) )
エラー E2451 test.cpp 73: 未定義のシンボル DATA_LEN(関数 voidstr_change(char *,char *) )
エラー E2379 test.cpp 77: ステートメントにセミコロン(;)がない(関数 voidstr_change(char *,char *) )
エラー E2268 test.cpp 79: 未定義の関数 'str_cpy' を呼び出した(関数 voidstr_change(char *,char *) )
エラー E2451 test.cpp 81: 未定義のシンボル temp(関数 voidstr_change(char *,char *) )
警告 W8070 test.cpp 85: 関数は値を返すべき(関数 voidstr_change(char *,char *) )
警告 W8070 test.cpp 115: 関数は値を返すべき(関数 voidstr_cpy(char *,char *) )
そうですね。
かと言って他の言語も知りませんが、C言語は難しい、と感じます。
仕事として今は必要がないからかも知れませんが達成感などないです。
極めるとOSだって作れちゃう・・・と言う言葉を鵜呑みにしてしまったのかも知れません。
それは私にはハードルが高過ぎでしょう。
でもありがとうございました。
No.5
- 回答日時:
おや、頻繁に出て来る質問の「for(;*ps != '\0';ps++,pd++)」の書き方が上級者風(ps++,pd++)っていうのもアンバランスで面白いですね。
また、for() の初期値を「 ; 」だけでクリアする使い方も気に入りました。 ただ、それは while() に変更するとプログラムの見通しが良くなるように思います。
/* int, void, スペースをきちんと書くと
こんな感じになりました。 */
#include <stdio.h>
#define N 7
#define ON 1
#define OFF 0
#define DATA_LEN 20
/* プロトタイプ宣言 */
void printData(char p[][DATA_LEN], int n);
void sort(char p[][DATA_LEN], int n);
void str_change(char *ps1, char *ps2);
void str_cpy(char *pd, char *ps);
int str_cmp(char *ps1, char *ps2);
int main(void)
{
char p_data[N][DATA_LEN]
={"ふじさわ","えのしま","しちりがはま","ごくらくじ","はせ","ゆいがはま","かまくら"};
printData(p_data,N);
sort(p_data,N);
printf("\nソートしました\n\n");
printData(p_data,N);
return 0;
}
void printData(char p[][DATA_LEN], int n)
{
int i;
for(i=0;i<n;i++)
printf("%s\n",p[i]);
}
void sort(char p[][DATA_LEN], int n)
{
int sw;
int i,j;
sw = ON;
for(i = n-1; i>=1 && sw == ON; i--){
sw = OFF;
for(j = 0; j< i; j++){
if(str_cmp(p[j],p[j+1]) > 0){
str_change(p[j],p[j+1]);
sw = ON;
}
}
}
}
int str_cmp(char *ps1, char *ps2)
{
int kekka;
while(*ps1 && *ps2 && *ps1==*ps2) ps1++,ps2++;
//for(; *ps1 != '\0' && *ps2 != '\0' && *ps1 == *ps2; ps1++,ps2++);
if(*ps1 > *ps2)
kekka = 1;
else if(*ps1 == *ps2)
kekka = 0;
else
kekka = -1;
return kekka;
}
void str_change(char *ps1, char *ps2)
{
char temp[DATA_LEN];
str_cpy(temp,ps1);
str_cpy(ps1,ps2);
str_cpy(ps2,temp);
}
void str_cpy(char *pd, char *ps)
{
while(*pd++=*ps++);
//for(;*ps != '\0';ps++,pd++)
//*pd = *ps;
//*pd = '\0';
}
そうですね。
かと言って他の言語も知りませんが、C言語は難しい、と感じます。
仕事として今は必要がないからかも知れませんが達成感などないです。
極めるとOSだって作れちゃう・・・と言う言葉を鵜呑みにしてしまったのかも知れません。
それは私にはハードルが高過ぎでしょう。
まだC言語って何者かがつかめません。
でもありがとうございました。
No.4
- 回答日時:
実際のソースをちゃんと貼り付けないとどうにもなりませんよ。
>kansuu4.c: In function ‘atr_cpy’:
このエラーに該当するところはないし。
まだC言語って何者かがつかめません。
Windowsでやる場合とEmacsでやる場合でコンパイルが違う結果になるような気がします。
とにかく解っていませんが、ありがとうございます。
No.3
- 回答日時:
タイプミスを直せば動きます。
あとは、無駄な改行とコメントを省くこと。そうすれば、一回で投稿できます。
#include <stdio.h>
#define N 7
#define ON 1
#define OFF 0
#define DATA_LEN 20
void printData(char p[][DATA_LEN], int n);
void sort(char p[][DATA_LEN], int n);
void str_change(char *ps1,char *ps2);
void str_cpy(char *pd,char *ps);
int str_cmp(char *ps1,char *ps2);
void main(){
char p_data[N][DATA_LEN] = {"ふじさわ","えのしま","しちりがはま","ごくらくじ","はせ","ゆいがはま","かまくら"};
printData(p_data,N);
sort(p_data,N);
printf("\nソ\ートしました\n\n");
printData(p_data,N);
}
void printData(char p[][DATA_LEN], int n){
int i;
for(i=0;i<n;i++){
printf("%s\n",p[i]);
}
}
void sort(char p[][DATA_LEN],int n){
int sw;
int i,j;
sw = ON;
for(i = n-1 ; i>=1 && sw == ON ; i--){
sw = OFF;
for(j = 0; j< i ;j++){
if(str_cmp(p[j],p[j+1]) > 0){
str_change(p[j],p[j+1]);
sw = ON;
}
}
}
}
int str_cmp(char *ps1,char *ps2){
int kekka;
for(;*ps1 != '\0' && *ps2 != '\0' && *ps1 == *ps2 ;ps1++,ps2++);
if(*ps1 > *ps2){
kekka = 1;
}else if(*ps1 == *ps2){
kekka = 0;
}else{
kekka = -1;
}
return kekka;
}
void str_change(char *ps1,char *ps2){
char temp[DATA_LEN];
str_cpy(temp,ps1);
str_cpy(ps1,ps2);
str_cpy(ps2,temp);
}
void str_cpy(char *pd,char *ps){
for(;*ps != '\0';ps++,pd++){
*pd = *ps;
}
*pd = '\0';
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- ゲーム 初代ps・PS2・3あたりで切ない雰囲気のゲームを教えてほしいです。 icoやぼくなつのような雰囲気 1 2023/01/20 01:21
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- 据え置き型ゲーム機 ps+でデータをセーブしたくてもできない。 1 2022/03/23 22:15
- C言語・C++・C# c言語 int temp = 0; if(isdigit(arr[i])){ temp=arr[i] 2 2022/03/27 01:44
- ゲーム ps(3.4.5)などの既定のボイスチャットが有るゲーム機で遊ぶ時に、通話アプリなどを使ってボイスチ 1 2023/03/02 14:11
- 食器・キッチン用品 こちらの部品の正体 3 2022/06/29 09:52
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
ftoa の作り方
-
C言語のfor文です。 繰り返しの...
-
エンディアン:2バイトのデー...
-
絶対パスからのファイル名の切...
-
テキストデータをそのままバイ...
-
charでの計算?
-
strtol関数 自作
-
C言語の入力した文字を反転させ...
-
3桁区切(コンマ)記号をつけ...
-
「ポインタのポインタ」を使っ...
-
【C言語】文字型と整数型の違い
-
コマンドラインに入力されてい...
-
c言語配列の結合についてです。...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
【C言語】構造体内の領域解放(...
-
文字列から空白を取り除きたい...
-
atoi( ) の反対をやりたい
-
OpenCVで32bit ヘッダ無しRaw画...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
charからLPTSTRへの変換方法
-
charでの計算?
-
配列をnビットシフトする
-
'const char *' 型は 'char *' ...
-
型変換
-
テキストデータをそのままバイ...
-
文字列から空白を取り除きたい...
-
CStringをwchar_tに変換したい
-
絶対パスからのファイル名の切...
-
fgetsなどのときのstdinのバッ...
-
ネットワークにつながっている...
-
str系関数を使わずに二つの文字...
-
3桁区切(コンマ)記号をつけ...
-
atoi( ) の反対をやりたい
-
double型の値をchar配列に変換...
-
C言語のfor文です。 繰り返しの...
-
switch文で文字を比較すること...
-
ファイル名である文字列からbas...
-
c++ 文字列を入力して、一文字...
-
strncpyと_tcsncpy_sのヌルの扱...
おすすめ情報