0

文字列配列を動的に割り当てたかったのですが、プログラムはユーザーに文字を要求し、文字 'q' が入力されるまで配列の最初の文字列にそれらを収集することになっています。その後、プログラムは文字を 2 行目に追加し始めます。 .

文字のメモリ位置を印刷すると、一度だけインクリメントしますが、各文字が 1 つではなく 2 つのメモリ セルを使用するように見えます。

これが私のプログラムのソースコードです

#include <stdio.h>

void main()
{

    char** txt;
    char* baseAddress;

    txt = (char **)malloc(5*sizeof(char*));
    *txt = (char *)malloc(20*sizeof(char));

    baseAddress = *txt;


    while (*(*txt) != 'q')
    {
       (*txt)++;
       scanf("%c", (*txt));
       printf("%p\r\n", (*txt));
    } 

    *txt = '\0';

    printf("%p", baseAddress);

    free(baseAddress);
    free(txt);
}

出力はこのようなものです

>j
>0x9e12021
>0x9e12022
>s
>0x9e12023
>0x9e12024
>

ポインターに問題がある可能性があると思います。これを達成するにはどうすればよいですか?そして悪い英語でごめんなさい

4

2 に答える 2

1

改行文字を忘れています。

たとえば、おそらく入力が「js」であると想像しているでしょう。ただし、エンターキーを打っているので、実際は「j\ns\n」です。

つまり、一度に 2 文字を入力していて、一度に 2 文字を読んでいるということです。あなたのコードは正常に動作しています。

于 2013-09-01T03:23:32.293 に答える
1

あなたのコードは何をしますか:

+----------------------------------------------+
|     +--------------------------------------+ |  
|  txt|*txt  |*txt+1 |*txt+2 |*txt+3 |*txt+4 | |
|     +--------------------------------------+ |
|       ^        ^    no memory alloc   ^      |
|       |        |_______not used_______|      |
|     +----+                                   |
|*txt |____|    <------------------------------+---you never give a value here,                            
| +1  |____|    <--j                           |
| +2  |____|    <-- '\n'                       |
| +3  |____|    <--s                           |
| +4  |____|    <-- '\n'                       |
|  .    .                                      |
|  .    .                                      |
|  .   ____                                    |
| +19 |____|                                   |
+----------------------------------------------+

だからあなたが必要です:

  1. whileループを書き直して、'\n'
  2. ユーザーがqを入力すると、新しい文字列メモリが割り当てられ、ユーザー入力が収集されます。

提案:

あなたの最初の文字列で

txt[0]の代わりに使用してください。の代わりに*txt使用してください。txt[0][i] and i++**txt and (*txt)++

希望が助けになります。 :-)

于 2013-09-01T04:40:27.007 に答える