- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用tip from other question构建一个上下文无关的语法模拟器。但我在分配足够的内存时遇到问题。
基本代码:
char * print_S ( )
{
int los = zero_or_one();
if ( los == 1 )
return "1";
else
return strcat( print_A(), print_A() );
}
char * print_A ( )
{
int los = zero_or_one();
if ( los == 1 )
return "0";
else
return strcat( print_S(), print_S() );
}
当 los = 0 时返回段错误。
然后我尝试了为字符串分配内存然后将其传递给函数的方法,但仍然没有运气:
char * out = (char *) malloc( 100 * sizeof(*out) );
printf("%s\n", print_S( out ) );
和
char * print_S ( char * out )
{
int los = zero_or_one();
if ( los == 1 ) {
strcpy (out, "1");
return out;
} else {
return strcat( print_A(out), print_A(out) );
}
}
char * print_A ( char * out )
{
int los = zero_or_one();
if ( los == 1 ) {
strcpy (out, "0");
return out;
} else {
return strcat( print_S(out), print_S(out) );
}
}
什么是正确的方法?谢谢
最佳答案
考虑到另一个问题的上下文,我认为您应该安排对函数的初始调用,以给出一个数组的开头和结尾,例如 100 个字符。当您递归地向下工作时,您会适本地增加传递给其他函数的起始指针。
这段代码对我有用:
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/* One of these is sufficient; symmetry requires both */
static char *print_S(char *dst, char *end);
static char *print_A(char *dst, char *end);
static int zero_or_one(void)
{
int rv = rand() % 2;
return rv;
}
static char *print_S(char *dst, char *end)
{
assert(dst <= end);
if (dst < end)
{
if (zero_or_one() == 0)
*dst++ = '0';
else
{
dst = print_A(dst, end);
dst = print_A(dst, end);
}
}
*dst = '\0';
return dst;
}
static char *print_A(char *dst, char *end)
{
assert(dst <= end);
if (dst < end)
{
if (zero_or_one() == 1)
*dst++ = '1';
else
{
dst = print_S(dst, end);
dst = print_S(dst, end);
}
}
*dst = '\0';
return dst;
}
int main(void)
{
srand(time(0));
for (int i = 0; i < 25; i++)
{
char buffer[100];
(void)print_A(buffer, buffer + sizeof(buffer) - 1);
printf("%s\n", buffer);
(void)print_S(buffer, buffer + sizeof(buffer) - 1);
printf("%s\n", buffer);
}
return 0;
}
请注意,序列通常很短,但也可能很长。运行一个示例:
01011
0
1
0
1
0
00
11
1
0
1
0
1
1110
00
101110101000000011100001110000100111011011000110001000000111010001000110000100010000111111001100011
1
0
11000011111000110011001000011100
0
1
1000000100001000
011
0
110
0
1
0
1
001
1
0110110011000
11110011110101100101100000111101011010001000110110010100011001100
10111001100101
1
100
100010
0
00
0
011
11
0000100010110
0
1
11
00
0
1
0
一些示例运行被截断为 99 个字符 - 正如本示例中的长字符一样。我也尝试过 300 和 1000 的尺寸;在这两种情况下,我得到的样本运行都被截断了。
如果你想做动态内存分配,你必须更狡猾一点:
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
/* One of these is sufficient; symmetry requires both */
static char *print_S(char **buffer, size_t *len, char *dst);
static char *print_A(char **buffer, size_t *len, char *dst);
static int zero_or_one(void)
{
int rv = rand() % 2;
return rv;
}
static void add_space(char **buffer, size_t *len, char **dst)
{
assert(*dst < *buffer + *len);
if (*dst == *buffer + *len - 1)
{
char *newbuf = realloc(*buffer, 2 * *len);
if (newbuf == 0)
{
fprintf(stderr, "Out of memory (%zu)\n", 2 * *len);
exit(1);
}
*len *= 2;
*buffer = newbuf;
*dst = *buffer + strlen(*buffer);
}
}
static char *print_S(char **buffer, size_t *len, char *dst)
{
add_space(buffer, len, &dst);
if (zero_or_one() == 0)
*dst++ = '0';
else
{
dst = print_A(buffer, len, dst);
dst = print_A(buffer, len, dst);
}
*dst = '\0';
return dst;
}
static char *print_A(char **buffer, size_t *len, char *dst)
{
add_space(buffer, len, &dst);
if (zero_or_one() == 1)
*dst++ = '1';
else
{
dst = print_S(buffer, len, dst);
dst = print_S(buffer, len, dst);
}
*dst = '\0';
return dst;
}
int main(void)
{
srand(time(0));
size_t len = 100;
char *buffer = malloc(len);
for (int i = 0; i < 25; i++)
{
(void)print_A(&buffer, &len, buffer);
printf("%zu: %s\n", strlen(buffer), buffer);
(void)print_S(&buffer, &len, buffer);
printf("%zu: %s\n", strlen(buffer), buffer);
}
free(buffer);
return 0;
}
这样,我得到了一次运行,输出字符串的长度为 14,473,874 字节。我不会费心把它打印在这里;可以说其中有 1 和 0。
关于c - 为 C 中的递归 strcat() 函数分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20261930/
这个问题在这里已经有了答案: implicit declaration of function itoa is invalid in c99 (3 个答案) C strcat - warning:
这个问题在这里已经有了答案: Why do I first have to strcpy() before strcat()? (5 个答案) 关闭 3 年前。 如题,我做了一个demo来说明一下我
我在使用下面的程序时遇到问题。我正在尝试扫描用户输入的特定单词的字符串命令。我现在的主要问题是,当我运行以下命令时,我收到一条警告,指出“传递 ‘strcat’ 的 arg 2 使指针来自整数而不进行
我知道发生这个 valgrind 错误是因为我试图使用未初始化的东西。下面的代码是导致此错误的代码。它正在做的是尝试读取 Racket 代码并获取每个符号,例如 + 或 define。 (标记化)我不
原型 extern char *strcat(char *dest,char *src); 用法 &n
让我们举个例子。 #include #include int main() { char str1[7] = "hello "; printf("Initial size of s
我试图在不改变单词顺序的情况下颠倒一个句子, 例如:"Hello World"=> "olleH dlroW" 这是我的代码: #include #include char * reverseWo
根据Allocate string (char*) in another function我现在有这样的代码: void someFunction(char** string, char** arg
我想不通。当我在我的 Windows 机器上使用 Code::Blocks 编译这段代码时,它工作得很好,但是当我尝试在 Cygwin 或学校的实际 Unix 机器下使用 Make 编译它时,我得到下
我在一些遗留代码中发现了这一点。 static char title1[] = "SUMMARY REPORT"; static char title2[] = "PERIOD: "; ... str
我正在尝试使用 C 中的指针和 strcat。这是我学习过程的一部分。 想法是用户输入一个包含数字的字符串,输出应该只返回数字。所以,如果用户输入te12abc 输出应该是 12。 这是我的第一次尝试
在对字符串进行一些程序时,我遇到了这个小问题。他们向我提出的问题是——编写函数 strcat(s,t) 的指针版本,它将字符串 t 复制到 s 的末尾。我把程序写成这样 - #include void
我在 strcat 和段错误方面遇到了一些问题。错误如下: Program received signal EXC_BAD_ACCESS, Could not access memory. Reaso
当运行以下故意堆栈粉碎代码时,strcat 将 source 的值复制十次。 #include #include int main() { char a[16]; char b[1
我在 C 中有一个函数,我试图从两个不同的位置(未知大小,可能很大)获取字符串并将它们组合成一个字符串并返回它们。如果我只打印两个字符串,那么我会得到正确的结果,但是当我尝试使用 strcat 组合字
void mystrcat(char* to, const char* from) { while (*to) to++; while (*from) *to++ = *from++;
这是 295c 的问题之一 #include #include main() { char *a="kammo DJ";
我需要用 C 语言编写一个 strcat。我尝试了以下操作: char * c_strcat( char * str1, const char * str2) { char * ret
我正在从文件中读取行,并且我决定按 char 逐个读取 char 中的部分内容。这是我得到的: char str[500]; // it has to be this size, I promi
这个问题已经有答案了: Can I copy a string in an empty string? (3 个回答) 已关闭 8 年前。 自学C语言充满惊喜。我做这个简短的片段来测试 strcat(
我是一名优秀的程序员,十分优秀!