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

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

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

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

Q&A

解決済

1回答

1293閲覧

C現言語初心者 文字列操作で\0と\nはどっちが先にchar型配列に格納されるのか知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2020/07/29 04:25

編集2020/07/29 04:40

C言語で文字列の終端である'\0'と改行コードである'\n'はどっちが先に来るのでしょうか?
またコメント部の画面表示の2重ループですが何故か.size() - 1する必要が出てきてしまうのですがどこで一個多く確保してしまっているのでしょうか?提示画像の上が読み込む.csvファイルです。下が実行結果です。最後がなぜか一つずれてしまいます。

#include "stdio.h" #include "stdlib.h" #include <vector> //.CSVファイルを読み込んでvector<int>二次元配列に格納 std::vector<std::vector<int>>* GetLoad_CSV(const char* filename,std::vector<std::vector<int>> *result = NULL) { FILE *fp; char tm[5000]; //読み込んだ.csvファイルの文字列 //const char *filename = "MapLayer1.csv"; //.csvファイルを読み込む //std::vector<std::vector<int>> idx; //マップチップ番号格納 std::vector<std::vector<int>> *idx = new (std::vector<std::vector<int>>); //マップチップ番号格納 int c = 0; int vi = 0; char str[10]; fp = fopen(filename, "r"); if (fp == NULL) { printf("読み込み失敗\n"); exit(1); } printf("読み込み成功\n\n"); while(fgets(tm, 5000, fp) != NULL) //一行づつ読み取り { idx->emplace_back(); int i = 0; while (true) { if ( (tm[i] >= '0' && tm[i] <= '9') || (tm[i] == '-' || tm[i] == '+') ) //文字だった場合 { str[c] = tm[i]; i++; c++; } else { int t = atoi(str);//数字をint型に変換 idx->back().push_back(t); //最後の配列に追加 //文字以外の数字でそれが'\0'だった最後なのでループを抜ける if (tm[i] == '\0') { break; } c = 0; i++; memset(str, '\0', sizeof(str)); //数字保存char型配列を空にする } } } // 画面表示 for (int i = 0; i < idx->size(); i++) { for (int j = 0; j < idx->at(i).size() - 1; j++) { printf("%d,", idx->at(i).at(j));///////////////////////////// } printf("\n"); } //格納するかどうか? if(result != NULL){ result = idx; } return idx;//第二引数がnullじゃない時 } int main() { GetLoad_CSV("MapLayer1.csv"); /* // 画面表示 for (int i = 0; i < idx.size(); i++) { for (int j = 0; j < idx[i].size() - 1; j++) { printf("%d,",idx[i][j]); } printf("\n"); } */ return 0; }

イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

文字列は\0が終端です。
\0 のあとになにが入ろうと、それは文字列にはなりません


何故か.size() - 1する必要が出てきてしまうのですが

\0 が来たときもそれを追加してるからでしょうね

投稿2020/07/29 04:27

編集2020/07/29 04:35
y_waiwai

総合スコア87774

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

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

y_waiwai

2020/07/29 04:28

で、なんでタグがC++なんでしょうか
退会済みユーザー

退会済みユーザー

2020/07/29 04:49

タグを間違えました。\0 の前に\nつまり改行が入っているということなのでしょうか? それとmemset();関数ですが\0にすると文字列を空?にしているのでしょうか? それとvectorというc++とstdio.hというC言語のコードが入り混じっていますがこれは別に大丈夫なのでしょうか?またindx.at().at();という指方をしていますが配列ではなくポインタのさしている先が配列なようなものなので[][]形式はできないということでいいのでしょうか?
y_waiwai

2020/07/29 04:56

ああ、C++のコードなんですね その提示のコードはあなたが組んだもんじゃないんでしょうか。 どこからもってきたもの?
退会済みユーザー

退会済みユーザー

2020/07/29 05:09

自分で作成したものですが#include <vector>とか入れているのにも関わらずstdio.hなど入れているのでどうなのかなと思ったんです。
y_waiwai

2020/07/29 05:38

C言語の標準関数に関しては、関数名に「C言語」とでもつけてぐぐれば使い方の解説でてきます。 そういうので使い方を学んでいけばいいです あとは、メモリ領域とポインタの使い方らへんですが、紙にメモリの展開図みたいなのを書いて、ポインタがどういう動きをするのかなど考えて行くと理解が早いと思います https://cyzennt.co.jp/blog/2019/05/04/c%E8%A8%80%E8%AA%9E%EF%BC%9A%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%81%AE%E6%A6%82%E5%BF%B5%E3%81%AE%E5%9B%B3%E8%A7%A3/
退会済みユーザー

退会済みユーザー

2020/07/29 06:43

//マップチップ番号格納 のnewしている部分ですがidxが持つアドレスがreturn するかresult変数がidxの持つアドレスをコピーしているのでこのnewしているidx変数はfree(idx);してはいけないと思うのでメモリリークしない正解のコードなのでしょうか?別に毎フレーム行う関数ではないのですが
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問