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

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

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

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

Q&A

解決済

3回答

2242閲覧

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

takuyakubokun

総合スコア13

C

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

0グッド

0クリップ

投稿2018/10/03 10:26

編集2018/10/03 10:56

: 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; }

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

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

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

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

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

y_waiwai

2018/10/03 10:29

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

回答3

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
文字列が不一致です。

参考までに・・・

c

1usr~/test/c % cat t.c 2 3#include <stdio.h> 4#include <ctype.h> 5#include <string.h> 6// 7int check(char *str); 8 9int main(void) 10{ 11 char str1[30]; 12 char str2[30]; 13 // 14 fputs("英小文字および数字を使った文字列を入力してください:", stdout); 15 fgets(str1, sizeof str1, stdin); 16 int checker = check(str1); 17 if (checker == 0) { 18 puts("入力は適切です。"); 19 } else{ 20 if (checker == 1) { 21 puts("入力が不適切です。大文字は使用できません。"); 22 } else if (checker == 2) { 23 puts("入力が不適切です。使用できる文字は英数字のみです。"); 24 } 25 // 26 return 1; 27 } 28 // 29 fputs("再度同じ文字列を入力してください:", stdout); 30 fgets(str2, sizeof str2, stdin); 31 // 32 if (strcmp(str1, str2) == 0) { 33 puts("文字列が一致しました。"); 34 }else{ 35 puts("文字列が不一致です。"); 36 } 37 38 return 0; 39} 40 41int check(char *str) 42{ 43 for (int i = 0; str[i] != '\n'; i++) { 44 char ch = str[i]; 45 if (islower(ch) || isdigit(ch)) { 46 continue; 47 } else { 48 if (isupper(ch)) { 49 // 大文字 50 return 1; 51 } else { 52 // その他 53 return 2; 54 } 55 } 56 } 57 // 58 return 0; 59} 60usr~/test/c %

投稿2018/10/03 11:35

編集2018/10/03 12:21
cateye

総合スコア6851

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

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

cateye

2018/10/03 12:30 編集

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

0

自己解決

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

投稿2018/10/03 11:33

takuyakubokun

総合スコア13

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

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

0

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

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

投稿2018/10/03 10:33

y_waiwai

総合スコア87747

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

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

takuyakubokun

2018/10/03 10:50

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

2018/10/03 11:01

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

2018/10/03 11:27

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

2018/10/03 11:31

エラーメッセージを読みましょう > check2(str); str が未定義です
takuyakubokun

2018/10/03 11:33

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

2018/10/03 11:34

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

2018/10/03 12:23

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

2018/10/03 12:33

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問