写入 malloc 字符串

Writing into a malloc string

提问人:Michael 提问时间:9/13/2022 最后编辑:Michael 更新时间:9/14/2022 访问量:62

问:

我是 C 编程语言的新手,准确地说是 malloc。因此,我创建了这个程序来从 argv 中获取参数并将它们全部放在一个字符串中,用空格分隔(第 32 行)。但是当我运行它时,一切都很好,但是在下面的代码中似乎没有根据需要插入空格。

当我尝试评论时,第 28 行:空格出现。buffer[t] = argv[str][i];

我还尝试了 casting: to 在将其分配给缓冲区之前,看看是否有任何变化¿¿。但什么都没有。malloc(buffSize)(char*)

如果有人能把我的事情弄清楚,我会很高兴的。提前🙏🏼致谢

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

int main()
{
    int str = 0, i = 0, t = 0, letterCount = 0, buffSize;
    char *buffer;
    char *argv[] = {"hello", "me", "too"};
    int argc = 3;

    while (str < argc)
    {
        while (argv[str][i++])
            letterCount++;
        str++;
        i = 0;
    }
    buffSize = letterCount + argc + 1;
    str = 0;
    buffer = (char*) malloc(buffSize);
    if (!buffer)
        return (NULL);
    while (str < argc)
    {
        while (argv[str][i] != '\0')
        {
            buffer[t] = argv[str][i];
            t++;
            i++;
        }
        buffer[t] = ' ';
        str++;
        i = 0;
    }
    printf("%s", buffer);
    return (0);
}
C 多维阵列 malloc

评论

3赞 Eugene Sh. 9/13/2022
retun (NULL)在发生错误(或任何其他情况)的情况下没有意义。main
3赞 Vlad from Moscow 9/13/2022
@Michael 什么是交流和av?
0赞 John Bollinger 9/13/2022
请注意,第一个程序参数(索引 0)通常是程序的名称。但是你看到的不是实际的程序参数,而是你手动定义的局部数组。
1赞 jarmod 9/13/2022
您没有运行此代码。您运行哪些代码?
0赞 John Bollinger 9/13/2022
是否禁止使用 C 的标准字符串函数,例如 和 ?因为你似乎通过实施自己的工作来为自己做不必要的工作。strlen()strcat()

答:

1赞 John Bollinger 9/13/2022 #1

但是当我运行它时,一切都很好,但是在下面的代码中似乎没有根据需要插入空格。

正如注释中指出的那样,您不太可能运行问题中提供的代码,因为它不是有效的 C。

但是,如果您运行了一个类似的程序并得到了您描述的结果,那么请仔细查看以下两段代码:

            buffer[t] = argv[str][i];
            t++;
            i++;

        buffer[t] = ' ';
        str++;
        i = 0;

你认为这两者之间的重要区别可以解释这个问题吗?前者做了什么,后者做不到?你有没有注意到,虽然你的程序不会在单词之间打印空格,但它确实(我希望)在最后一个单词之后打印一个?

这不是代码的唯一问题,但请在那里寻找当前问题的答案。

1赞 abdo Salm 9/13/2022 #2

实际上,您在问题中没有提到什么和代表什么,所以我从代码中删除了它们,并用它们的等效数字替换了它们。acav

你正在做很多详尽的编程,比如而不是使用像 和这样的函数,而是手动实现它,但无论哪种方式,都是你的选择。strlen()strcat()

  1. 当您将字符放入新数组中时,您在这一行中的问题是,但您实际上并没有增加用于放置字符的索引,这就是空格字符总是被下一个字符覆盖的原因,所以,您应该这样做buffer[t] = ' ';' 'tbuffer[t++] = ' ';
  2. 最后,您正在行中打印,但实际上调用的变量从未被 null char 终止,所以最后您应该这样做printf("%s", buffer);buffer'\0'buffer[t] = '\0';

这就是我在您的代码中编辑的全部内容,但您的代码实际上需要再次重写,这是仅进行以下 2 次修改的编辑代码:

    #include <stdio.h>
#include <stdlib.h>
#define NUM_OF_SPACES    3

int main()
{
    int str = 0, i = 0, t = 0, letterCount = 0, buffSize;
    char *buffer;
    char *argv[] = {"hello", "me", "too"};
    int argc = 3;

    while (str < argc)
    {
        while (argv[str][i++])
            letterCount++;
        str++;
        i = 0;
    }

    buffSize = letterCount + NUM_OF_SPACES + 1;
    str = 0;
    buffer = (char*) malloc(buffSize);
    if (!buffer)
        return (0);
    while (str < argc)
    {
        while (argv[str][i] != '\0')
        {
            buffer[t] = argv[str][i];
            t++;
            i++;
        }
        buffer[t++] = ' ';
        str++;
        i = 0;
    }
    buffer[t] = '\0';
    printf("%s", buffer);
    return (0);
}

这是输出:

hello me too

评论

0赞 Michael 9/14/2022
对于造成的任何混淆,我们深表歉意。我进行了编辑。感谢您的澄清。我看到了我的错误。虽然我认为 t++ 应该在退出 while 循环之前增加 t。