0

我想动态分配一个字符串数组,程序应该向用户询问字符并将它们收集到数组的第一个字符串中,直到输入字母'q'然后程序开始将字符添加到第二行等等.

当我打印字符内存位置时,似乎每个字符都占用两个内存单元而不是一个,尽管我只增加了一次。

这是我的程序的源代码

#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”。

因此,您一次输入两个字符,并且一次读取两个字符。您的代码行为正常。

于 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 回答