10

何らかの理由で、次のコードが出力されます(null):

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char *foo; 
    scanf("%ms", &foo);
    printf("%s", foo);
    free(foo);
}

文字列に動的にメモリを割り当てようとしていますが、前に述べたように、プログラムは単に(null)を出力します。getcheとreallocを使用して関数を作成することでこれを回避しましたが、ユーザーがバックスペースやタブなどを入力した場合にどうなるかをプログラムする必要があるため、ほとんど意味がないようです。周りと私はむしろ上記のコードが機能していない理由を知りたいです...

追加情報:

Pelles C IDE v7.00を使用しており、C11標準でコンパイルしています

4

5 に答える 5

10

ドラフトC11標準%mのセクション7.21.6.2 (のセクション)には表示されません。それを避けて、C99の場合と同じように電話することをお勧めします。fscanfmalloc()

于 2012-08-13T01:08:40.880 に答える
1

%mはPOSIX拡張子であるため、PellesCでは使用できない可能性があります。

于 2013-04-16T18:06:31.177 に答える
1

scanf / sscanfのマニュアルページ(3ページの270〜290行目)には、次の例があります。

動的割り当て変換指定子を使用するには、長さ修飾子としてmを指定します(したがって、%msまたは%m [範囲])。次の例のように、呼び出し元は返された文字列をfree(3)する必要があります。

char *p;
int n;

errno = 0;
n = scanf("%m[a-z]", &p);
if (n == 1) {
   printf("read: %s\n", p);
   free(p);
} else if (errno != 0) {
   perror("scanf");
} else {
   fprintf(stderr, "No matching characters\n");
}

上記の例に示されているように、scanf()呼び出しが文字列を正常に読み取った場合にのみ、free(3)を呼び出す必要があります。

出典:SCANF(3)-Linuxプログラマーマニュアル-GNU-2013-01-30

于 2020-03-14T22:23:36.377 に答える
0

Linux 3.2.0amd64とgcc4.7.2を使用しています。コードの使用:

char *s; 
scanf("%ms", &s);
printf("%s", s);
free(s);

正常に動作しますが、空白は受け入れられません。

静的割り当ての場合、代わりに次を使用できます。

char s[100];
printf("Enter string (max 99 characters): ");
scanf("%100[^\n]s", &s);
printf("You entered: %s\n", s);

それが役に立てば幸い!

于 2014-12-31T14:02:17.090 に答える
0

アルンが言うように、この解決策は正しく、メニンクスの意見は間違っています:

char *s;
scanf("%ms", &s);
printf("%s", s);
free(s);

私は「manscanf」を読みました、それは言います:

オプションの「m」文字。これは文字列変換(%s、%c、%[)で使用され
、入力を保持するために対応するバッファーを割り当てる必要性から呼び出し元を解放します。代わりに、scanf()は十分なサイズのバッファーを割り当て、アドレスを割り当てますこのバッファの対応するポインタ 引数へのポインタ。これは、char *変数へのポインタである必要があります(この変数は、呼び出しの前に初期化する必要はありません)。その後、呼び出し元は、このバッファーが不要になったときに、このバッファーを解放(3)する必要があります。

于 2016-05-24T10:17:34.367 に答える