[解決済み] mallocで文字列を確保する
質問
C言語でプログラミングを始めたばかりで、今は文字列を勉強しています。
質問ですが、もし私が
malloc
(以下のコードのように)文字列の末尾にNULL文字が自動的に挿入されるのでしょうか?
ここの他の質問で答えが見つかりましたが、NULL文字は自動的に含まれないようです。
しかし、ここで問題が発生します。
strlen
はNULL文字がないと動作しませんが、このコードではNULL文字を使っており、動作しています。だから、私はそこに
\0
を、どこにも書いていないのに、文字列の末尾につけています。
答えは何でしょう?
以下はそのコードです。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char** argv) {
char *stringa1;
int n;
int i;
printf("How many characters in the string? ");
scanf("%d", &n);
stringa1 = (char*) malloc(n*sizeof(char));
printf("Insert the string: ");
scanf("%s", stringa1);
free(stringa1);
return 0;
}
解決方法は?
malloc()
が返されます。
void*
ヒープに格納されたメモリブロックへのポインタを指定します。で割り当てる。
malloc()
ヌル文字を追加するには、自分で行うか、または、以下のような関数を使用します。
scanf()
この文字を追加してくれます。とは言っても、この
\0
という文字があらかじめ入っています。
あなたの
malloc()
の呼び出しは、代わりにこのようにする必要があります。
stringa1 = (char*) malloc((n+1)*sizeof(char)); /*+1 for '\0' character */
注 mallocの戻り値をキャストする必要はありません。詳しくは これ .
もう一つ、指摘すべきは
sizeof(char)
は
1
で、これを掛けると
malloc()
の呼び出しは必要ありません。
また
malloc()
が返す
NULL
. このようにすることができます。
if (stringa1 == NULL) {
/* handle exit */
また
strlen()
はヌル文字で終端する文字列で、そうでなければ、これは結局
未定義の動作
.
一旦
scanf()
が呼び出され
stringa1
に何らかの文字が含まれている場合は
strlen()
を追加しました。
さらに
scanf()
も良いアイデアです。こんな感じでチェックできます。
if (scanf("%d", &n) != 1) {
/* handle exit */
これらの変更を加えたあなたのコード。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
char *stringa1 = NULL;
size_t n, slen;
printf("How many characters in the string? ");
if (scanf("%zu", &n) != 1) {
printf("Invalid input\n");
exit(EXIT_FAILURE);
}
stringa1 = malloc(n+1);
if (stringa1 == NULL) {
printf("Cannot allocate %zu bytes for string\n", n+1);
exit(EXIT_FAILURE);
}
printf("Insert the string: ");
scanf("%s", stringa1);
slen = strlen(stringa1);
printf("String: %s Length: %zu\n", stringa1, slen);
free(stringa1);
stringa1 = NULL;
return 0;
}
関連
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] バイトを文字列に変換する
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] C言語でオブジェクト指向のコードを書くとしたら、どのようにすればよいのでしょうか?[クローズド]
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み】大文字・小文字を区別しない「Contains(string)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
libc++abi.dylib: NSException タイプの捕捉されない例外で終了するエラー
-
エラー: 宣言されていない識別子 'bool' の使用と C コンパイラでの問題点
-
警告: 'struct XXX' はパラメータリストの内部で宣言されています。
-
[解決済み] C関数から文字列を返す
-
[解決済み] C言語で関数型プログラミングを行うためのツールにはどのようなものがありますか?
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] C言語でのブーリアン値の使用
-
[解決済み] while ( !feof (file) ) 」は、なぜいつも間違っているのですか?
-
[解決済み] longをフォーマットするprintfの引数は何ですか?
-
[解決済み] char s[]とchar *sの違いは何ですか?