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

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

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

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

Q&A

解決済

6回答

6826閲覧

C言語 式の構文エラー 内容について

ISARIA

総合スコア19

C

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

0グッド

0クリップ

投稿2015/06/07 10:28

編集2015/06/07 11:51

複数の単語からなる文を入力し,各単語の先頭文字を大文字に変えて表示させる
というプログラムを作っているのですが、コンパイル時に

Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
hw72.cpp:
エラー E2188 hw72.cpp 5: 式の構文エラー(関数 Big_letter(char *) )
エラー E2377 hw72.cpp 5: For文に ) がない(関数 Big_letter(char *) )
警告 W8004 hw72.cpp 11: 'i' に代入した値は使われていない(関数 Big_letter(char *)
)
*** 2 errors in Compile ***

というエラーが出てしまい、迷走しています。
以下が実際に作ってみてエラーが出ているプログラムです。
アドバイスをいただけますか?
よろしくお願いします!

#include<stdio.h>

void Big_letter(char str[])
{
for(int i=0;i<str[];i++9){
if(str[i]==NULL){
str[i+1] -= 0x20;
}
}
puts(str);
}

int main(void)
{
char str[1024];

printf("Type sentens:"); scanf("%s",str); puts(str); Big_letter(str);

}

補足です
実行結果が、
here is tokyo. と入力したら
Here Is Tokyo. と返ってくるようなプログラムを作れという問題です。
日本語で、上手く伝わっていなかったようで、すみません。

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

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

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

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

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

guest

回答6

0

元の雰囲気を残しつつ書き換えるとこんな感じで。

lang

1#include <stdio.h> 2#include <ctype.h> 3 4void Big_letter(char str[]) 5{ 6 str[0] = toupper(str[0]); 7 for(int i=1;str[i];i++){ 8 if(str[i-1]==' '){ 9 str[i] = toupper(str[i]); 10 } 11 } 12 fputs(str,stdout); 13} 14 15int main(void) 16{ 17 char str[1024]; 18 19 printf("Type sentence:"); 20 fgets(str, 1024, stdin); 21 22 fputs(str,stdout); 23 24 Big_letter(str); 25}

今回のテーマ以外の部分では、
・scanfは仕様が非常に難しい関数なので少なくとも初心者は使うべきで無い ⇒ fgetsを使う
・putsは、改行を追加出力するので、それが意図的じゃ無ければ、fputsを使う
・「センテンス」のスペルミス

投稿2015/06/07 13:02

編集2015/06/07 14:12
otn

総合スコア84505

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

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

cateye

2015/06/07 13:18

if(str[i-1]==' '){では空白(スペース)のみのかつ1文字の判断になりますね 考え方 1.空白(スペース、タブなどisspace()が真になる文字)があれば読み飛ばす。 2.読み飛ばして最初に現れた文字を大文字にする。←isalpha()が真になるか判断してもいいかもしれない 3.空白か行末が現れるまで読み飛ばす。 4.行末が現れるまで、1~3を繰り返す。
otn

2015/06/07 13:33

そこまで複雑なことをしなくても、これで十分ですよ。 空白の連続があれば空白の2文字目以降についてもtoupper()が呼ばれますが、toupper()は英小文字以外はそのまま返すので。行末の空白についても同様。 タブも対象にしたい場合は、isblank()か、isspace()で判断します。
ISARIA

2015/06/07 14:08

ホントにありがとうございます。 無事完成しました。 fgetsを初めて知ったので、少しつまづきましたが、使いやすい?ですね。
guest

0

ベストアンサー

void Big_letter(char str[])
{
for(int i=0;i<str[];i++9){ ←ここの記述ミスですね。

for(
int i; C言語ではこれできないとおもいます。
i < str[]; str[]の中に添字がありません str[0] こんな感じで必要です。
i++9 この記述もエラーです i++; i+=9; どちらかですね

投稿2015/06/07 14:07

MasaakiIrie

総合スコア1021

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

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

ISARIA

2015/06/07 14:10

ありがとうございます。全て無事に直りました。 i++9は最後の)をする時にShiftの押し忘れで、消し忘れでした笑。ありがとうございました。
yohhoy

2015/06/08 14:56

参考までに:たしかに古いC言語では、「for(int i=0; i<10; i++)」のように、for文の中で新しい変数を宣言できませんでした。ただしC++言語や、"新しいC言語"ではfor文中でも変数宣言ができるようになっています。(どのバージョンに対応するかはコンパイラ次第ですけど)
guest

0

>補足です
>実行結果が、
>here is tokyo. と入力したら
>Here Is Tokyo. と返ってくるようなプログラムを作れという問題です。
上記ですが、上に示した、

//scanf("%s", str); fgets(str, sizeof(str), stdin); str[strlen(str) - 1] = '\0';

で、OKでは?

投稿2015/06/08 10:35

frogman

総合スコア129

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

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

0

標準関数を使用しないのであれば、なかば、強引に。。。

lang

1#include<stdio.h> 2#include <string.h> 3 4void Big_letter(char str[] ) 5{ 6 int i; 7 for( i=0; str[i] != '\0'; i++ ){ 8 if( str[i] == ' ' ) continue; 9 10 if( i == 0 || str[i - 1] == ' ' && str[i] != '\0') { 11 str[ i ] -= 0x20; 12 } 13 } 14 15 puts(str); 16} 17 18int main(void) 19{ 20 char str[1024]; 21 22 printf("Type sentens:"); 23 24 //scanf("%s", str); 25 fgets(str, sizeof(str), stdin); 26 str[strlen(str) - 1] = '\0'; 27 28 puts(str); 29 30 Big_letter(str); 31}

投稿2015/06/07 12:01

編集2015/06/07 12:24
frogman

総合スコア129

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

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

frogman

2015/06/07 12:10

本来ならば、あえて、勉強のために作成するのでないなら、他に既に共通関数が無いかどうかを調べた上で、上の方がやられているように、toupperを使用したほうが良いです。 既にある関数を新たに作るのは、車輪の再発明となってしまいます。
guest

0

上記のソースと以下のソースを比較してみてください。

lang

1#include<stdio.h> 2 3void Big_letter(char str[] ) 4{ 5 int i; 6 for( i=0; str[i] != '\0' ;i++ ){ 7 if( i == 0 ) { 8 str[ i ] -= 0x20; 9 } 10 } 11 12 puts(str); 13} 14 15int main(void) 16{ 17 char str[1024]; 18 19 printf("Type sentens:"); 20 21 scanf("%s", str); 22 23 puts(str); 24 25 Big_letter(str); 26}

投稿2015/06/07 11:16

編集2015/06/07 11:39
frogman

総合スコア129

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

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

ISARIA

2015/06/07 11:41

ありがとうございます。 ただ、例えば、i am foolishと入力した場合、iだけ変換されてしまいました。 aとfも変換するにはどうすればいいのでしょうか? よろしくお願いします。
frogman

2015/06/07 11:44

上記は、そもそもfor文で書く必要ないですね。。。 void Big_letter(char str[] ) { str[ 0 ] -= 0x20; puts(str); } 可能なら、上記の方がやられているように、標準関数を使用したほうが良いと思います。
cateye

2015/06/07 11:53

~/test cat tst2.c #include <stdio.h> #include <ctype.h> int main() { int ch; char str[32]; fputs("Type sentens:",stdout); do{ scanf("%s",str); ch= toupper(str[0]); str[0]= (char)ch; puts(str); }while(str[0]!='0'); return 0; } ~/test ./a.out Type sentens:aaa bbb ccc ddd eee 0 Aaa Bbb Ccc Ddd Eee 0 ~/test
ISARIA

2015/06/07 11:54

ありがとうございます 標準関数というのは、ctype.hを使うということですか?
cateye

2015/06/07 12:01

toupper()を使うためにctype.hをインクルードするd^^という事です。toupper()はintを返すので一度intで受けてcharにしています。
guest

0

void Big_letter(char str[])
{
for(int i=0;i<str[];i++9){ ←for(int i=0;str[i];i++){・・・たぶん
if(str[i]==NULL){ ← 何の判定ですか?
str[i+1] -= 0x20; ← +1は何をしているのですか?
}
}
puts(str);
}

投稿2015/06/07 11:09

cateye

総合スコア6851

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

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

cateye

2015/06/07 11:28

追加ですが、scanfは空白文字は読み込みません。 なので、 ~/test ./a.out Type sentens:abc efg Abc ~/test こうなります。 ~/test cat tst2.c #include <stdio.h> #include <ctype.h> int main() { int ch; char str[32]; fputs("Type sentens:",stdout); scanf("%s",str); ch= toupper(str[0]); str[0]= (char)ch; puts(str); return 0; } ~/test ./a.out Type sentens:abcdefg Abcdefg ~/test
ISARIA

2015/06/07 11:58

長文をありがとうございます 質問文での日本語が足りなくてすみません。 空白を見つけたら、その次の文字を大文字にするというやり方をやろうと思いまして、空白が==NULLということを考えていました。 2語目も大文字にするには何をすればいいのでしょうか? 済みませんが、お願いしてもいいですか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問