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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C

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

Q&A

7回答

4245閲覧

C言語の基本的なプログラム(文字列charに関して)

abuuu1203

総合スコア20

C

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

1グッド

1クリップ

投稿2016/06/26 08:31

編集2022/01/12 10:55

C言語の初歩的な部分だと認識しているのですが、分からない、というよりも、どうしても動かせないプログラムがあります。

プログラムはcharでつくった文字列の中身を表示したり、文字数を表示したりするものです。

詳しい目的として、以下のような概要になっています。

『任意入力をそれ以前の入力の後に付け加え、全体の文字列、その長さと消去されるまでの残り文字数を表示し、”clear”と
入力されるか、文字列長が 100 を超えた時点で文字列全体を消去せよ。このとき、文字列を消去したことを明示することとする。”exit”と入力された時点で終了せよ。文字列入力
およびその処理は”exit”と入力されるまで無限ループとせよ。』

そこで、組み立てたプログラムがこれです。

C

1#include<stdio.h> 2#include<string.h> 3#define STRLEN 30 4 5int main(void) 6{ 7 char a[STRLEN], b[STRLEN]; /* ふたつの配列を作成(入力用に)*/ 8 char c[5] = "exit"; /* 配列にexitが入力された場合、その配列==0を指定できるよう、別個で配列を用意*/ 9 char d[6] = "clear"; 10 int l; /*配列長*/ 11 int r; /*残り文字数*/ 12 13 printf("*You may finish this window by entering 'exit'\nEnter some kind of string: "); 14 scanf("%s", a); 15 16 17 for (;;) /**/ 18 { 19 20 printf("Enter some more string: "); 21 scanf("%s", b); 22 23 24 25 if (strcmp(a , c) == 0 ) { /*条件2:配列aにexitが入力されたことが真であると確認できたとき*/ 26 break; /*ウインドウを終了する*/ 27 } 28 29 if (strcmp(a , d) == 0) { 30 } 31 32 strcat(a , b); /*配列aの後にbを連結*/ 33 l = strlen(a); /*lが配列aの長さを表すことを指定*/ 34 35 if (l => 30) { /*条件1:文字列長が100になったとき*/ 36 a[0] = '\0'; /*それまで入力された文字列をクリアする*/ 37 } 38 39 else { 40 41 printf("文字列の中身は %s\n", a); 42 43 44 printf("文字列の長さは %d\n", l); 45 46 r = STRLEN - l; 47 printf("残りの文字数は %d\n", r); /*残り文字数の計算式*/ 48 49 } 50 51 return 0; 52 53 }

スクリプトの表示例はこのような感じになるみたいです。

Enter a string: 1234ghij[Enter]
String = 1234ghij, Length = 8, Remaining = 22
Enter a string: abcdefg[Enter]
String = 1234ghijabcdefg, Length = 15, Remaining = 15
Enter a string: clear[Enter]
String cleared
Enter a string: exit[Enter]

C言語を始めたばかりで、今まで使っていた言語と少し勝手が違うと認識しながら悪戦苦闘しています。
目的の『』内の動作になれば完成です。
エラーをちゃんと書け!と言われると思うのですが、いかんせん色々と出てしまい、エラーの種類や意味も分からない状態です。
エディター、コンパイラはXcodeを使用しています。
どうか訂正のほどよろしくお願いします。

訂正です。
こちらがエラーになります。
よろしくお願いします。

gcc -Wall -o samp4.6.24.exe samp4.6.24.c
samp4.6.24.c: In function ‘main’:
samp4.6.24.c:10:2: error: stray ‘\343’ in program
int l; /配列長/
^
samp4.6.24.c:10:2: error: stray ‘\200’ in program
samp4.6.24.c:10:2: error: stray ‘\200’ in program
samp4.6.24.c:11:2: error: stray ‘\343’ in program
int r; /残り文字数/
^
samp4.6.24.c:11:2: error: stray ‘\200’ in program
samp4.6.24.c:11:2: error: stray ‘\200’ in program
samp4.6.24.c:17:2: error: stray ‘\343’ in program
for (;;) /**/
^
samp4.6.24.c:17:2: error: stray ‘\200’ in program
samp4.6.24.c:17:2: error: stray ‘\200’ in program
samp4.6.24.c:25:3: error: stray ‘\343’ in program
if (strcmp(a , c) == 0 ) { /条件2:配列aにexitが入力されたことが真であると確認できたとき/
^
samp4.6.24.c:25:3: error: stray ‘\200’ in program
samp4.6.24.c:25:3: error: stray ‘\200’ in program
samp4.6.24.c:32:3: error: stray ‘\343’ in program
strcat(a , b); /配列aの後にbを連結/
^
samp4.6.24.c:32:3: error: stray ‘\200’ in program
samp4.6.24.c:32:3: error: stray ‘\200’ in program
samp4.6.24.c:33:3: error: stray ‘\343’ in program
l = strlen(a); /lが配列aの長さを表すことを指定/
^
samp4.6.24.c:33:3: error: stray ‘\200’ in program
samp4.6.24.c:33:3: error: stray ‘\200’ in program
samp4.6.24.c:35:10: error: expected expression before ‘>’ token
if (l => 30) { /条件1:文字列長が100になったとき/
^
samp4.6.24.c:35:10: error: stray ‘\343’ in program
samp4.6.24.c:35:10: error: stray ‘\200’ in program
samp4.6.24.c:35:10: error: stray ‘\200’ in program
samp4.6.24.c:35:10: error: stray ‘\343’ in program
samp4.6.24.c:35:10: error: stray ‘\200’ in program
samp4.6.24.c:35:10: error: stray ‘\200’ in program
samp4.6.24.c:35:10: error: stray ‘\343’ in program
samp4.6.24.c:35:10: error: stray ‘\200’ in program
samp4.6.24.c:35:10: error: stray ‘\200’ in program
samp4.6.24.c:36:4: error: stray ‘\343’ in program
a[0] = '\0'; /それまで入力された文字列をクリアする/
^
samp4.6.24.c:36:4: error: stray ‘\200’ in program
samp4.6.24.c:36:4: error: stray ‘\200’ in program
samp4.6.24.c:47:4: error: stray ‘\343’ in program
printf("残りの文字数は %d\n", r); /残り文字数の計算式/
^
samp4.6.24.c:47:4: error: stray ‘\200’ in program
samp4.6.24.c:47:4: error: stray ‘\200’ in program
samp4.6.24.c:53:1: error: expected declaration or statement at end of input
}
^
samp4.6.24.c:53:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^

DrqYuto👍を押しています

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

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

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

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

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

tanat

2016/06/26 08:49

エラーの記載が無いと、同じ環境を作るか、端から端までソースコードを精査する必要があるので回答する手間が莫大に増え、結果として極端に回答が少なくなってしまいます。 エラーがたくさん出てどれを記載してわからないのであれば、全て記載して、要らないと指摘があったら消す方がまだ回答が得られるかと思いますよ。
abuuu1203

2016/06/27 07:45 編集

ご指摘ありがとうございます。 こちらがエラーです。 本文にも更新をしました。 お願いします gcc -Wall -o samp4.6.24.exe samp4.6.24.c samp4.6.24.c: In function ‘main’: samp4.6.24.c:10:2: error: stray ‘\343’ in program int l; /*配列長*/ ^ samp4.6.24.c:10:2: error: stray ‘\200’ in program samp4.6.24.c:10:2: error: stray ‘\200’ in program samp4.6.24.c:11:2: error: stray ‘\343’ in program int r; /*残り文字数*/ ^ samp4.6.24.c:11:2: error: stray ‘\200’ in program samp4.6.24.c:11:2: error: stray ‘\200’ in program samp4.6.24.c:17:2: error: stray ‘\343’ in program for (;;) /**/ ^ samp4.6.24.c:17:2: error: stray ‘\200’ in program samp4.6.24.c:17:2: error: stray ‘\200’ in program samp4.6.24.c:25:3: error: stray ‘\343’ in program if (strcmp(a , c) == 0 ) {  /*条件2:配列aにexitが入力されたことが真であると確認できたとき*/ ^ samp4.6.24.c:25:3: error: stray ‘\200’ in program samp4.6.24.c:25:3: error: stray ‘\200’ in program samp4.6.24.c:32:3: error: stray ‘\343’ in program strcat(a , b);  /*配列aの後にbを連結*/ ^ samp4.6.24.c:32:3: error: stray ‘\200’ in program samp4.6.24.c:32:3: error: stray ‘\200’ in program samp4.6.24.c:33:3: error: stray ‘\343’ in program l = strlen(a);  /*lが配列aの長さを表すことを指定*/ ^ samp4.6.24.c:33:3: error: stray ‘\200’ in program samp4.6.24.c:33:3: error: stray ‘\200’ in program samp4.6.24.c:35:10: error: expected expression before ‘>’ token if (l => 30) {  /*条件1:文字列長が100になったとき*/   ^ samp4.6.24.c:35:10: error: stray ‘\343’ in program samp4.6.24.c:35:10: error: stray ‘\200’ in program samp4.6.24.c:35:10: error: stray ‘\200’ in program samp4.6.24.c:35:10: error: stray ‘\343’ in program samp4.6.24.c:35:10: error: stray ‘\200’ in program samp4.6.24.c:35:10: error: stray ‘\200’ in program samp4.6.24.c:35:10: error: stray ‘\343’ in program samp4.6.24.c:35:10: error: stray ‘\200’ in program samp4.6.24.c:35:10: error: stray ‘\200’ in program samp4.6.24.c:36:4: error: stray ‘\343’ in program a[0] = '\0';  /*それまで入力された文字列をクリアする*/ ^ samp4.6.24.c:36:4: error: stray ‘\200’ in program samp4.6.24.c:36:4: error: stray ‘\200’ in program samp4.6.24.c:47:4: error: stray ‘\343’ in program printf("残りの文字数は %d\n", r); /*残り文字数の計算式*/ ^ samp4.6.24.c:47:4: error: stray ‘\200’ in program samp4.6.24.c:47:4: error: stray ‘\200’ in program samp4.6.24.c:53:1: error: expected declaration or statement at end of input } ^ samp4.6.24.c:53:1: warning: control reaches end of non-void function [-Wreturn-type] } ^ Linux Ubuntuのコマンドでのコンパイルです。
abuuu1203

2016/06/27 07:47

見づらくて申し訳ありません。 本文をご覧ください。
guest

回答7

0

どう動かないかを書かないとなんともアドバイスのしようがないですが、
return 0; の記述が for文 の中に入ってしまっているのですぐにプログラムが終了してしまいます。

まずはそこを for文 の外に出すことでループが続けられると思います。

あと、 exitclear は、入力された文字列と比較しないとならないので、 b と比較しないとうまく動かないと思います。

投稿2016/06/26 08:48

edo_m18

総合スコア2283

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

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

0

まずコンパイルのエラーとしては、35行目のfor文の条件では、(l=>30)を(l>=30)に書き換える
c言語では、不等号においで、イコールは最後に書くようにしてます。

次に、return 0;の直前に}をつけないといけない。はじめ括弧と終わり括弧では対になってないと、コンパイルが通りません。

この二つ直せば、動きましますが、但し、仕様にある"clearを入力すると文字列を消去する"と"exitを入力するとプログラムが終了する"という条件が満たしてなくて、無限ループの中身を見ていきましょう。
ここで、変数a,b,c,dの四つが使用されたことが分かり、aは全体の文字列、bは新しく入力された文字列。c、dはそれぞれ文字列"clear"と"exit"を保存する場所がわかりました。自然言語で流れを書いてみると。

if(入力した文字列はclear)
全体文字列aをクリアする。(最後にaとbをstrcatしてるのでbもクリアした方がよい)
if(入力した文字列がexit)
プログラムを終了

とあります。ここで、特に注意する必要あるのは、ifの中の条件文、変数c,dと比較するのは入力する文字列である変数bです。あなたのプログラムにはおそらく比較対象が違うと思います。
できるだけそっちのプログラムの書き方に合わせて、自分の動作するプログラムも載せます。良ければ参考まで。

/*-------------------------------------------------------------------------

int main(void)
{
char a[STRLEN], b[STRLEN]; /* ふたつの配列を作成(入力用に)/
char c[5] = "exit"; /
配列にexitが入力された場合、その配列==0を指定できるよう、別個で配列を用意*/
char d[6] = "clear";
int l; /配列長/
int r; /残り文字数/

printf("*You may finish this window by entering 'exit'\nEnter some kind of string: ");
scanf("%s", a);

for (;;) /**/
{

printf("Enter some more string: "); scanf("%s", b); if (strcmp(b , c) == 0 ) { /*条件2:配列aにexitが入力されたことが真であると確認できたとき*/ break; /*ウインドウを終了する*/ } if (strcmp(b , d) == 0) { a[0] = '\0'; b[0] = '\0'; } strcat(a , b); /*配列aの後にbを連結*/ l = strlen(a); /*lが配列aの長さを表すことを指定*/ if (l >= 30) { /*条件1:文字列長が100になったとき*/ a[0] = '\0'; /*それまで入力された文字列をクリアする*/ } else { printf("文字列の中身は %s\n", a); printf("文字列の長さは %d\n", l); r = STRLEN - l; printf("残りの文字数は %d\n", r); /*残り文字数の計算式*/ } }

return 0;
}
-------------------------------------------------------------------------*/

投稿2016/06/28 06:26

Hank

総合スコア12

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

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

0

エラーは先頭から対処するのが常套手段です。
“error: stray ‘\343’ in program”は全角の空白が原因だと思いますが・・・

投稿2016/06/28 00:26

cateye

総合スコア6851

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

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

0

一旦、ソースコードの整理しては、どうでしょうか?

例えば

printf("*You may finish this window by entering 'exit'\nEnter some kind of string: "); scanf("%s", a); // <- 必要ですか?

strcat(a , b); /*配列aの後にbを連結*/

のstrcatは無条件で連結していますので、メモリ破壊する可能性があります。

投稿2016/06/26 15:10

ai_2013_dev

総合スコア338

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

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

0

コンパイル エラー
2点追加修正してください。
###1.

if (l => 30) { /*条件1:文字列長が100になったとき*/ a[0] = '\0'; /*それまで入力された文字列をクリアする*/ }

下記のように条件を修正

if (l >= 30) { /*条件1:文字列長が100になったとき*/ a[0] = '\0'; /*それまで入力された文字列をクリアする*/ }

###2.

} return 0; }

下記のようにreturnの上}を追加

} } // <- 追加 return 0; }

ただし、上記の修正だけでは、仕様(期待動作)を満たしていません。

投稿2016/06/26 14:45

ai_2013_dev

総合スコア338

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

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

0

//これでどうですか?

#include<stdio.h> #include<string.h> #define STRLEN 30 int main(void) { char a[STRLEN], b[STRLEN]; /* ふたつの配列を作成(入力用に)*/ char c[5] = "exit"; /* 配列にexitが入力された場合、その配列==0を指定できるよう、別個で配列を用意*/ char d[6] = "clear"; int l; /*配列長*/ int r; /*残り文字数*/ printf("*You may finish this window by entering 'exit'\nEnter some kind of string: "); scanf("%s", a); for (;;) /**/ { printf("Enter some more string: "); scanf("%s", b); if (strcmp(a , c) == 0 ) { /*条件2:配列aにexitが入力されたことが真であると確認できたとき*/ exit(0); /*ウインドウを終了する*/ } if (strcmp(a , d) == 0) { } strcat(a , b); /*配列aの後にbを連結*/ l = strlen(a); /*lが配列aの長さを表すことを指定*/ if (l <= 30) { /*条件1:文字列長が100になったとき*/ a[0] = '\0'; /*それまで入力された文字列をクリアする*/ } else { printf("文字列の中身は %s\n", a); printf("文字列の長さは %d\n", l); r = STRLEN - l; printf("残りの文字数は %d\n", r); /*残り文字数の計算式*/ } } return 0; }

---26行目 breakだとifから抜けるだけなのでexit(0)にしました。
---35行目 =<を<=にしました。
---50行目{が閉じられてなかったので}を付けました。

---環境が違うからできるかわかりませんが…---


新規追加

printf("Enter some more string: "); scanf("%s", b); if (strcmp(a , c) == 0 ) { /*条件2:配列aにexitが入力されたことが真であると確認できたとき*/ exit(0); /*ウインドウを終了する*/ }

if (strcmp(a , c) == 0 ) { /*条件2:配列aにexitが入力されたことが真であると確認できたとき*/ exit(0); /*ウインドウを終了する*/ } printf("Enter some more string: "); scanf("%s", b); if (strcmp(b , c) == 0 ) { /*条件2:配列aにexitが入力されたことが真であると確認できたとき*/ exit(0); /*ウインドウを終了する*/ }

にしたほうがいいと思います。
あと、コメント欄に書いたとおり if (l <= 30)をif (l >= 30)に

---テストランを行っていません---

投稿2016/06/26 12:33

編集2016/06/27 20:38
-maeda-

総合スコア34

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

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

abuuu1203

2016/06/27 07:50

ありがとうございます。 こちらで試してみたところ、exitを2回入れるとウインドウを閉じる仕様になり、それ以外を入力すると延々と入力を求めるような感じになっているようです。 文字列の内容や文字列長、残り文字数が表示されないうようです。 よろしくお願いします。
abuuu1203

2016/06/27 07:52

ちなみにこれは、exitだと以下のようなエラーが出たので、breakにして試してみた結果です。 エラー: warning: implicit declaration of function ‘exit’ [-Wimplicit-function-declaration] exit(0); /*ウインドウを終了する*/ ^ kadai1.6.24.c:25:1: warning: incompatible implicit declaration of built-in function ‘exit’ [enabled by default]
abuuu1203

2016/06/27 07:57

度々すみません。 #include<stdlib.h>を宣言したら、コンパイルできました。 しかし、ユーザーからの入力を延々と求めるプログラムになってしまっているようです。 お願いします。
-maeda-

2016/06/27 10:23 編集

すいません。 35行目 <=でなく>=でした。 ---環境がおかしいのでテストを行っていません---
guest

0

こんにちは。

まずはコンパイル・エラーを取りましょう。
手元のMinGW(gcc)でコンパイルしたところ、下記エラーがでました。

test.c: In function 'main': test.c:35:16: error: expected expression before '>' token if (l => 30) { /*条件1:文字列長が100になったとき*/ ^ test.c:53:5: error: expected declaration or statement at end of input } ^

エラーをちゃんと書け!と言われると思うのですが、いかんせん色々と出てしまい、エラーの種類や意味も分からない状態です。

その通りです。分かっているならやりましょう。
上記のようにエラーメッセージをコピペすることはできると思いますよ。

手元で上記エラーとedo_m18さんのご指摘を修正したところ、そこそこ動いているようです。
後はclearをちゃんとコーディングすることですね。
他に、現在は100文字ではなく30文字が文字列の最大長さのようです。仕様とプログラムをマッチさせましょう。


【余談ですが】
「スクリプト」は間違った表現です。元々shell(bash等)用のプログラムのことを通常のプログラムと区別する意味でスクリプトと表現していました。その流れでゲーム用簡易言語のプログラムのこともスクリプトと呼ばれるようになったようです。
その後、ゲーム開発ツールUnityがC#プログラムのことを「スクリプト」と表現し始めたようです。ゲーム用のプログラムの意味で使うことで、ゲーム・スクリプトを組んでいるようなゲーム・プログラマが学習しやすいことを狙ったのではないかと思います。
しかし、完全に誤用ですのでコンパイラ言語のプログラムをスクリプトと呼ぶのは避けた方が良いですよ。

投稿2016/06/26 09:17

Chironian

総合スコア23272

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問