提问人:Michael 提问时间:9/13/2022 最后编辑:Michael 更新时间:9/14/2022 访问量:62
写入 malloc 字符串
Writing into a malloc string
问:
我是 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);
}
答:
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
实际上,您在问题中没有提到什么和代表什么,所以我从代码中删除了它们,并用它们的等效数字替换了它们。ac
av
你正在做很多详尽的编程,比如而不是使用像 和这样的函数,而是手动实现它,但无论哪种方式,都是你的选择。strlen()
strcat()
- 当您将字符放入新数组中时,您在这一行中的问题是,但您实际上并没有增加用于放置字符的索引,这就是空格字符总是被下一个字符覆盖的原因,所以,您应该这样做
buffer[t] = ' ';
' '
t
buffer[t++] = ' ';
- 最后,您正在行中打印,但实际上调用的变量从未被 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。
评论
retun (NULL)
在发生错误(或任何其他情况)的情况下没有意义。main
strlen()
strcat()