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

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

詳細はこちら
C

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

Q&A

解決済

4回答

4568閲覧

char型の配列の一部の数字(文字列)を、数値として取り出すには、どうしたらいいですか?

Dr.yoshikieast

総合スコア2

C

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

0グッド

0クリップ

投稿2021/01/18 11:52

編集2021/01/18 12:30

前提・実現したいこと

char型の配列の一部の数字(文字列)を、数値として取り出すには、どうしたらいいですか?

追記:
まずfgetsで一行目でnを入力します。
そして、2行目に1から10までの数字の文字列が入力させます。
例 

9 3 2 1 10
抜けていて申し訳ないです。

該当のソースコード

C

1char str[1000]; 2fgets(str, sizeof(str), stdin); 3char **words = malloc(sizeof(char*)*n); 4 5words[0] = strtok(str, " "); 6 7for (int i = 1; i < n; i++) 8{ 9 words[i] = strtok(NULL, " "); 10} 11for (int i = 0; i < n; i++) 12{ 13 int n = atoi(word[i]); //このような配列の途中を数値にしたいです。 14 printf("%d\n", n); 15} 16

試したこと

atoiを使うと、文字列すべてが変換されてしまうので、配列の途中を変換できない

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

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

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

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

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

kazuma-s

2021/01/18 12:19 編集

fgets で読み込む文字列の例を具体的に挙げてください。 malloc や for文の n はどうやって決まるのですか?
Dr.yoshikieast

2021/01/18 12:28

まずfgetsで一行目でnを入力します。 そして、2行目に1から10までの数字の文字列が入力させます。 例  5 9 3 2 1 10 抜けていて申し訳ないです。
ppaul

2021/01/18 12:57

練習問題とするなら、入力に複数の数字が含まれるのをやったほうが、勉強になりそう。 例えば "here is a liquid whose weight is 10kg and volume is 700ml"とかは解析できるかな。
Dr.yoshikieast

2021/01/18 14:15

今回は、全て数字なので、ベストアンサーで大丈夫なのですが、ppaulさんの文章にも対応できるように考えてみます! ありがとうございます。
guest

回答4

0

ベストアンサー

不正な入力に対するチェックをしなくてよいなら

C

1#include <stdio.h> // fgets, printf 2#include <stdlib.h> // malloc, free, atoi, strtol 3 4int main(void) 5{ 6 char str[1000]; 7 fgets(str, sizeof(str), stdin); 8 int n = atoi(str); 9 int *d = malloc(sizeof(int) * n); 10 11 fgets(str, sizeof(str), stdin); 12 char *p = str; 13 for (int i = 0; i < n; i++) 14 d[i] = strtol(p, &p, 10); 15 16 for (int i = 0; i < n; i++) 17 printf("%d\n", d[i]); 18 free(d); 19}

実行例

text

15 29 3 2 1 10 39 43 52 61 710

投稿2021/01/18 12:44

kazuma-s

総合スコア8224

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

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

Dr.yoshikieast

2021/01/18 13:28

実際に書いていただきありがとうございます。 自分が書いていたのが、文字列で扱っていたのが、悪かったのが、分かってよかったです。
Dr.yoshikieast

2021/01/19 09:23

記事読みました。 あの記事を見ると 自由に入力できるとなると 標準入力ってラスボス級なんですね…笑
guest

0

べつにcharの配列を用意しといて、その一部分の数字をそこにコピー、終端に'\0'を入れとけば、atoi で数値変換できますね

投稿2021/01/18 12:13

y_waiwai

総合スコア88038

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

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

Dr.yoshikieast

2021/01/18 13:26

回答ありがとうごさいます! 考え方が分かりやすくて、ありがたいです。
guest

0

C++使っていいなら std::from_chars が該当ですね。文字列の範囲を指定するので任意の位置までを変換できます。
https://cpprefjp.github.io/reference/charconv/from_chars.html

投稿2021/01/18 12:09

yumetodo

総合スコア5852

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

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

Dr.yoshikieast

2021/01/18 12:33

c言語で解いていて、まだc++学習してないので、C++を学習した際に、実行してみようと思います!
yumetodo

2021/01/18 16:24

まあほとんどCの知識だけで扱えるとおもうので気軽に触ってみてください
guest

0

int n = atoi(word[i]);

簡単には、

C

1 char *p = word[i]; 2 while (*p != '\0') { 3 int n = *p - '0'; 4 p++; 5 }

あたりでしょうか。エラーチェックとか一切、考えてないですが。

投稿2021/01/18 12:02

pepperleaf

総合スコア6385

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問