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

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

ただいまの
回答率

90.51%

  • C

    4534questions

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

ポインタで1つ目の関数のstrを二つ目の関数で使うことはできないでしょうか?あと二つ目のwarningも解いてほしいです

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 358

: In function ‘main’:
04.c:10:12: error: ‘str’ undeclared (first use in this function)
check2(str);
^
04.c:10:12: note: each undeclared identifier is reported only once for each function it appears in
04.c: In function ‘check2’:
04.c:54:16: warning: passing argument 1 of ‘strcmp’ makes pointer from integer without a cast [-Wint-conversion]
while(strcmp(str,str2)!=0);
^
In file included from 04.c:3:0:
/usr/include/string.h:140:12: note: expected ‘const char *’ but argument is of type ‘char’
extern int strcmp (const char *s1, const char *s2)

コード
#include<stdio.h>
#include<ctype.h>
#include<string.h>
int check(void);
int check2(char str);
int main(void){
  int checker=check();
  if(checker==0){
    printf("入力は適切です\n");
    check2(str);
  }
  if(checker==1){
    printf("入力が不適切です。大文字は使用できません。\n");
  }
  if(checker==2){
    printf("入力が不適切です。使用できる文字は英数字のみです。\n");
  }

  return 0;
}

int check(void){
  char str[30];
  int i;
  printf("英小文字および数字を使った文字列を入力してください:");
  scanf("%s",str);
  for(i=0;str[i]!='\0';i++){

     if(islower(str[i]) || isdigit(str[i])){
       return 0;
     }
     else{
       if(isupper(str[i]) || isdigit(str[i])){
           return 1;
         }
         else {
           return 2;
         }

     }
  }
}

int check2(char str){
  char str2[30];
  int j;
  printf("再度同じ文字列を入力してください:");
  do{
  scanf("%s",str2);
  for(j=0;str2[j]!='\0';j++){
    if(isupper(str2[j])!=0){
      str2[j]=tolower(str2[j]);
    }}}
  while(strcmp(str,str2)!=0);

        printf("文字列が一致しました\n");
        return 0;
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • y_waiwai

    2018/10/03 19:29

    コードは<code>ボタンで、’’’の枠の中に貼り付けてください

    キャンセル

回答 3

check解決した方法

0

グローバル変数
配列とポインタ

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

while(strcmp(str,str2)!=0); 

引数の型が違います
str はchar ですね。
また、この行も意味不明です。なにをさせたいんでしょう

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/03 19:50

    do〜while 文のwhile でループをつくりたいです
    char型であっていますか?

    キャンセル

  • 2018/10/03 20:01

    strcmp関数の引数は双方とも char* です。char ではないです
    また、このコードではstrcmp関数の戻り値が0以外の場合、無限ループとなってしまい、ここから抜け出せません。

    キャンセル

  • 2018/10/03 20:27

    strを配列にして解決できました1つ目のエラーはどうやって解決するんでしょうか?よろしくお願いします

    キャンセル

  • 2018/10/03 20:31

    エラーメッセージを読みましょう

    > check2(str);

    str が未定義です

    キャンセル

  • 2018/10/03 20:33

    グローバル変数にすればよかったんですね解決しました!

    キャンセル

  • 2018/10/03 20:34

    果たしてそれで解決なんやら。。

    キャンセル

  • 2018/10/03 21:23

    学校の課題なんですが、僕もこんなクソコード書きたくないんですがこれでうまくいきましたありがとうございます。ちゃんと動いてます

    キャンセル

  • 2018/10/03 21:33

    クソコードにするか、勉強の糧とするかはあなた自身ですd^^

    キャンセル

0

int check(void)内で宣言されたstrを他の関数で参照することは出来ません。main()内で確保して引き渡すようにしましょう。
また、scanf("%s",str2);は、入力文字数が30を超えると(たぶん)暴走します。fgets(str,sizeof str,stdin);を使いましょうd^^
蛇足:先の質問if 文の周りでのエラーが解決できません。でも言いましたが、小文字/数字の判定がおかしいです。
//
usr~/test/c % ./a.out
英小文字および数字を使った文字列を入力してください:1234567
入力は適切です。
再度同じ文字列を入力してください:1234567
文字列が一致しました。
usr~/test/c % ./a.out
英小文字および数字を使った文字列を入力してください:abc123
入力は適切です。
再度同じ文字列を入力してください:Abc123
文字列が不一致です。
usr~/test/c % ./a.out
英小文字および数字を使った文字列を入力してください:abc123
入力は適切です。
再度同じ文字列を入力してください:abc12
文字列が不一致です。

参考までに・・・

usr~/test/c % cat t.c

#include <stdio.h>
#include <ctype.h>
#include <string.h>
//
int check(char *str);

int main(void)
{
    char str1[30];
    char str2[30];
    //
    fputs("英小文字および数字を使った文字列を入力してください:", stdout);
    fgets(str1, sizeof str1, stdin);
    int checker = check(str1);
    if (checker == 0) {
        puts("入力は適切です。");
    } else{
        if (checker == 1) {
            puts("入力が不適切です。大文字は使用できません。");
        } else if (checker == 2) {
            puts("入力が不適切です。使用できる文字は英数字のみです。");
        }
        //
        return 1;
    }
    //
    fputs("再度同じ文字列を入力してください:", stdout);
    fgets(str2, sizeof str2, stdin);
    //
    if (strcmp(str1, str2) == 0) {
        puts("文字列が一致しました。");
    }else{
        puts("文字列が不一致です。");
    }

    return 0;
}

int check(char *str)
{
    for (int i = 0; str[i] != '\n'; i++) {
        char ch = str[i];
        if (islower(ch) || isdigit(ch)) {
            continue;
        } else {
            if (isupper(ch)) {
                // 大文字
                return 1;
            } else {
                // その他
                return 2;
            }
        }
    }
    //
    return 0;
}
usr~/test/c % 

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/03 20:39 編集

    fgets()は改行まで読み込みます、注意して下さい。・・・終端判定には'\n'を使うかstr[strlen(str)-1]= '\0';とする
    追記:課題ということで題意と違うなら読み捨てて下さい。

    キャンセル

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

  • C

    4534questions

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

  • トップ
  • Cに関する質問
  • ポインタで1つ目の関数のstrを二つ目の関数で使うことはできないでしょうか?あと二つ目のwarningも解いてほしいです