🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

Q&A

4回答

1115閲覧

文字列を入力して整数と記号を分ける

chara1234d

総合スコア10

C

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

0グッド

0クリップ

投稿2021/01/23 07:58

12+345
と言う文字列を入力して、整数と記号に分ける問題です。
1 整数
2 整数

  • 記号

3 整数
4 整数
5 整数
と回答したところ
12 整数

  • 記号

345 整数
で表示して欲しい
と言われてしまいました。
str[2]で発見した時に
str[0],str[1]
を組み合わせれば良い
というアドバイスを受けていますが良く分かりません。
atoi( )なるものがあることも調べましたが上手く出来ません。
宜しくお願いします。

#include <stdio.h>
#include <string.h>

int main(void)
{
char str[100];
int i;

printf("入力して下さい\n"); scanf("%s",str); printf("strlen(str) %lu\n",strlen(str)); for(i=0;i<strlen(str);i++) { if((str[i]>=0x30) && (str[i]<=0x39) ) { printf("%c 整数",str[i]); } else { printf("%c 記号",str[i]); } printf("\n"); } return 0;

}

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

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

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

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

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

tatsu99

2021/01/23 08:17 編集

記号についてですが、12+-345と入力された場合 +記号 ー記号 ですか、それとも +-記号 ですか。
dodox86

2021/01/23 08:38

質問者さんが"12+345"と言う文字列を目にしたとき、頭の中でそれをどう計算しているかを具現化すれば良いのです。 例えば左端から1文字ずつ見ていって、'+'が来たらそれまでの数文字列はひとつの値としてみなして計算しませんか? 頭の中でまとまっていないうちにコードを何となくこねくり回しても正解にたどり着けません。
chara1234d

2021/01/23 08:58

アドバイスいろいろ、ありがとうございます。 tatsu99さん 実際には入力は 12+345-678 で 出題者は後々、 (12)+(345)-(678) の計算をさせたいのだと思います。 宜しくお願いします。
chara1234d

2021/01/23 09:01

dodox86さん >ひとつの値としてみなして と言うのは分かりますが、 n =atoi(str[0],str[1]); printf("%d 整数",n); 宜しくお願いします。 とすると、エラーになってしまいました。
dodox86

2021/01/23 09:44

> >ひとつの値としてみなして > と言うのは分かりますが、 > n =atoi(str[0],str[1]); > printf("%d 整数",n); いえ、そういうことではなく。
guest

回答4

0

1文字ずつ処理する代わりに、strspnstrcspnを使って、「0~9で構成される部分文字列」と「0~9以外の文字で構成される部分文字列」を取得し、出力していく例。

C

1#include <stdbool.h> 2#include <stdio.h> 3#include <stdlib.h> 4#include <string.h> 5 6void print_result(char *src, int len, bool is_num); 7 8#define MAX_SIZE 100 9 10int main(void) 11{ 12 char str[MAX_SIZE]; 13 14 printf("入力して下さい\n"); 15 fgets(str, sizeof(str), stdin); 16 char *tail = str + strlen(str) - 1; 17 if (*str != '\0' && *tail == '\n') { 18 *tail = '\0'; 19 } 20 21 printf("strlen(str) %lu\n", strlen(str)); 22 23 for (char *ptr = str; *ptr != '\0';) { 24 int num_len = strspn(ptr, "0123456789"); 25 if (num_len > 0) { 26 print_result(ptr, num_len, true); 27 ptr += num_len; 28 continue; 29 } 30 int sym_len = strcspn(ptr, "0123456789"); 31 if (sym_len > 0) { 32 print_result(ptr, sym_len, false); 33 ptr += sym_len; 34 continue; 35 } 36 /* never reach here */ 37 puts("OOPS!"); 38 break; 39 } 40 41 return 0; 42} 43 44void print_result(char *src, int len, bool is_num) 45{ 46 char result[MAX_SIZE]; 47 48 strncpy(result, src, len); 49 result[len] = '\0'; 50 printf("%s %s\n", result, is_num ? "整数" : "記号"); 51}

投稿2021/01/23 09:08

編集2021/01/23 09:09
Daregada

総合スコア11990

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

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

0

「表示する」ということだけでいいのなら別にstr[0],str[1]を組み合わせるとかそんなことは考えずに
毎回入力文字を表示しておいて、文字種類が切り替わったらそれまでの文字種類を表示するとかすればよいのでは。

C

1#include <stdio.h> 2#include <string.h> 3enum TYPE { BEGIN, NON_DIGIT, DIGIT, DONE }; 4 5int main(void) { 6 enum TYPE chType, prev_chType = BEGIN; 7 char str[100]; 8 9 printf("入力して下さい\n"); 10 scanf("%99s", str);//こうしておかないと「scanf警察」が踏み込んでくるかも 11 12 printf("strlen(str) %lu\n\n", strlen(str)); 13 14 for (long i = 0; i <= strlen(str); i++) {//終端の'\0'まで検索する 15 char c = str[i]; 16 if (c == '\0') { 17 chType = DONE; 18 } else if ('0' <= c && c <= '9') {//使っていいならisdigit()の方が 19 chType = DIGIT; 20 } else { 21 chType = NON_DIGIT; 22 } 23 //型が切り替わったらこれまでが何だったかを表示 24 if ((chType != prev_chType) && (prev_chType != BEGIN)) { 25 char *type; 26 if (prev_chType == DIGIT) { 27 type = "整数"; 28 } else { 29 type = "記号"; 30 } 31 printf("\t%s\n", type); 32 } 33 printf("%c", c); 34 //一つ前の型がなんだったかを記憶 35 prev_chType = chType; 36 } 37 return 0; 38}

出題者は後々、

(12)+(345)-(678)
の計算をさせたいのだと思います。

というのが見えているのなら、それへの対策を仕込んでおいて

C

1#include <stdio.h> 2#include <string.h> 3 4enum TYPE { BEGIN, NON_DIGIT, DIGIT, DONE }; 5 6int main(void) { 7 enum TYPE chType, prev_chType = BEGIN; 8 char str[100]; 9 int num[100] = {0}; //取得した数値データを蓄積 10 char op[100]; //取得した記号データを蓄積 11 int items = 0; //取得した要素総数 12 13 printf("入力して下さい\n"); 14 scanf("%99s", str); 15 16 printf("strlen(str) %lu\n\n", strlen(str)); 17 18 for (long i = 0; i <= strlen(str); i++) { 19 char c = str[i]; 20 if (c == '\0') { 21 chType = DONE; 22 } else if ('0' <= c && c <= '9') { 23 chType = DIGIT; 24 } else { 25 chType = NON_DIGIT; 26 } 27 if ((chType != prev_chType) && (prev_chType != BEGIN)) { 28 //型が変わったので次の要素に進む 29 items++; 30 } 31 if (chType == DIGIT) { 32 //取得した桁を追加する 33 num[items / 2] = num[items / 2] * 10 + c - '0'; 34 } else if (chType == NON_DIGIT) { 35 op[items / 2] = c; 36 } 37 prev_chType = chType; 38 } 39 40 //取得したデータを表示 41 //データが数値-記号-...の順であることが前提。 42 //記号-数値-...の順で入力される可能性があるなら要対応 43 for (int item = 0; item < items; item++) { 44 if (item % 2 == 0) { 45 printf("%d\t整数\n", num[item / 2]); 46 } else { 47 printf("%c\t記号\n", op[item / 2]); 48 } 49 } 50 51 return 0; 52}

とかなんとか。

投稿2021/01/24 01:00

thkana

総合スコア7703

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

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

0

数字の開始位置と終了位置を取得すればよいでしょう。

C

1#include <stdio.h> // printf, scanf 2#include <string.h> // strlen 3 4int main(void) 5{ 6 char str[100]; 7 int i, j; 8 9 printf("入力して下さい\n"); 10 scanf("%99s", str); 11 printf("strlen(str) %zu\n", strlen(str)); 12 for (i = 0; str[i]; ) 13 if (str[i] >= '0' && str[i] <= '9') { 14 for (j = i; str[++i] >= '0' && str[i] <= '9'; ) ; 15 printf("%.*s 整数\n", i - j, str + j); 16 } 17 else printf("%c 記号\n", str[i++]); 18}

数字は数値として取得したいようなので strtol を使ってみました。

C

1#include <stdio.h> // printf, scanf 2#include <string.h> // strlen 3#include <stdlib.h> // strtol 4 5int main(void) 6{ 7 char str[100]; 8 9 printf("入力して下さい\n"); 10 scanf("%99s", str); 11 printf("strlen(str) %zu\n", strlen(str)); 12 for (char *p = str; *p; ) 13 if (*p >= '0' && *p <= '9') 14 printf("%ld 数字\n", strtol(p, &p, 10)); 15 else 16 printf("%c 記号\n", *p++); 17}

投稿2021/01/23 08:51

編集2021/01/24 04:39
kazuma-s

総合スコア8224

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

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

0

簡単には、数字用のバッファを用意して、、

C

1char strN[100]; // 数字用のバッファ 2int j; // 数字が何文字入ったか

で、

printf("%c 整数",str[i]);

の代わりに、

C

1 strN[j] = str[i]; 2 j++;

とし、

printf("%c 記号",str[i]);

のところで、(その前に)

C

1 if (j > 0) { 2 strN[j] = '\0'; // 文字列として出力するため 3 printf("%s 整数\n", strN); 4 j = 0; // 次の入力用 5 }

そして、 for()を抜けたところで、もし未出力の数字があれば、

C

1 if (j > 0) { 2 strN[j] = '\0'; 3 printf("%s 整数\n", strN); 4 }

あたりでしょうか?

投稿2021/01/23 08:29

pepperleaf

総合スコア6385

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問