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

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

ただいまの
回答率

90.61%

  • C

    3572questions

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

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

解決済

回答 6

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,115

ISARIA

score 18

複数の単語からなる文を入力し,各単語の先頭文字を大文字に変えて表示させる
というプログラムを作っているのですが、コンパイル時に
------
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. と返ってくるようなプログラムを作れという問題です。
日本語で、上手く伝わっていなかったようで、すみません。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 6

+2

元の雰囲気を残しつつ書き換えるとこんな感じで。
#include <stdio.h>
#include <ctype.h>

void Big_letter(char str[])
{
    str[0] = toupper(str[0]);
    for(int i=1;str[i];i++){
        if(str[i-1]==' '){
            str[i] = toupper(str[i]);
        }
    }
    fputs(str,stdout);
}

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

    printf("Type sentence:");
    fgets(str, 1024, stdin);

    fputs(str,stdout);

    Big_letter(str);
}

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/07 22:18

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

    キャンセル

  • 2015/06/07 22:33

    そこまで複雑なことをしなくても、これで十分ですよ。
    空白の連続があれば空白の2文字目以降についてもtoupper()が呼ばれますが、toupper()は英小文字以外はそのまま返すので。行末の空白についても同様。

    タブも対象にしたい場合は、isblank()か、isspace()で判断します。

    キャンセル

  • 2015/06/07 23:08

    ホントにありがとうございます。
    無事完成しました。

    fgetsを初めて知ったので、少しつまづきましたが、使いやすい?ですね。

    キャンセル

checkベストアンサー

+1

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 23:10

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

    キャンセル

  • 2015/06/08 23:56

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

    キャンセル

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 20: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

    キャンセル

  • 2015/06/07 20:58

    長文をありがとうございます

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

    キャンセル

0

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

#include<stdio.h>

void Big_letter(char str[] )
{
    int i;
    for( i=0; str[i] != '\0'  ;i++ ){
        if( i == 0 ) {
                str[ i ] -= 0x20;
        }
    }

    puts(str);
}

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

    printf("Type sentens:");

    scanf("%s", str);

    puts(str);

    Big_letter(str);
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/07 20:41

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

    キャンセル

  • 2015/06/07 20:44

    上記は、そもそもfor文で書く必要ないですね。。。
    void Big_letter(char str[] )
    {
    str[ 0 ] -= 0x20;
    puts(str);
    }

    可能なら、上記の方がやられているように、標準関数を使用したほうが良いと思います。

    キャンセル

  • 2015/06/07 20: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

    キャンセル

  • 2015/06/07 20:54

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

    キャンセル

  • 2015/06/07 21:01

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

    キャンセル

0

標準関数を使用しないのであれば、なかば、強引に。。。
#include<stdio.h>
#include <string.h>

void Big_letter(char str[] )
{
    int i;
    for( i=0; str[i] != '\0'; i++ ){
        if( str[i] == ' ' ) continue;

        if( i == 0 || str[i - 1] == ' ' &&  str[i] != '\0') {
                str[ i ] -= 0x20;
        }
    }

    puts(str);
}

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

    printf("Type sentens:");

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

    puts(str);

    Big_letter(str);
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/07 21:10

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

    キャンセル

0

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

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

で、OKでは?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3572questions

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