请用递归的方法实现strcat
时间: 2024-05-02 16:18:06 浏览: 6
由于strcat函数是将第二个字符串追加到第一个字符串的末尾,因此可以考虑递归地将第二个字符串中的字符一个一个添加到第一个字符串的末尾。
具体实现如下:
```c++
char* my_strcat(char* dest, const char* src) {
if (*src == '\0') { // 如果第二个字符串已经遍历完毕
*dest = '\0'; // 在第一个字符串的末尾添加'\0'
return dest;
} else {
*(dest + strlen(dest)) = *src; // 将第二个字符串的当前字符添加到第一个字符串的末尾
return my_strcat(dest, src + 1); // 递归调用,处理下一个字符
}
}
```
其中,`dest`为目标字符串,`src`为要追加的字符串,`strlen(dest)`表示目标字符串的长度,`*(dest + strlen(dest))`表示目标字符串的末尾。在递归调用中,每次处理完一个字符后,`src`指针向后移动一位,指向下一个字符。当`src`指向字符串的末尾时,递归结束,返回目标字符串。
相关问题
用C语言写一个消除文法左递归的程序
以下是一个消除文法左递归的C语言程序:
```c
#include <stdio.h>
#include <string.h>
#define MAX_PROD 10
#define MAX_LEN 10
int n;
char non_term[MAX_PROD];
char prod[MAX_PROD][MAX_LEN];
char new_prod[MAX_PROD][MAX_LEN];
void eliminate_left_recursion(int i) {
int j, k, l, m;
char new_non_term = non_term[i];
int count = 0;
for (j = 0; j < i; j++) {
if (non_term[j] == new_non_term) {
count++;
}
}
for (j = 0; j < i; j++) {
if (non_term[j] != new_non_term) {
strcpy(new_prod[j], prod[j]);
for (k = 0; k < count; k++) {
strcat(new_prod[j], "'");
}
strcat(new_prod[j], " ");
strcat(new_prod[j], new_non_term);
}
}
for (j = 0; j < i; j++) {
if (non_term[j] == new_non_term) {
strcpy(new_prod[j + i], prod[j]);
for (k = 0; k < count; k++) {
strcat(new_prod[j + i], "'");
}
for (l = 0; l < i; l++) {
if (non_term[l] != new_non_term) {
strcat(new_prod[j + i], " ");
strcat(new_prod[j + i], non_term[l]);
}
}
strcat(new_prod[j + i], "'");
}
}
strcpy(non_term, new_non_term);
for (j = 0; j < i; j++) {
strcpy(prod[j], new_prod[j]);
}
n += count;
}
int main() {
int i, j;
printf("Enter number of productions: ");
scanf("%d", &n);
printf("Enter productions:\n");
for (i = 0; i < n; i++) {
scanf("%s", prod[i]);
non_term[i] = prod[i][0];
}
for (i = 0; i < n; i++) {
for (j = 0; j < i; j++) {
if (non_term[i] == non_term[j]) {
eliminate_left_recursion(i);
i--;
break;
}
}
}
printf("Productions after eliminating left recursion:\n");
for (i = 0; i < n; i++) {
printf("%s\n", prod[i]);
}
return 0;
}
```
该程序首先读取输入的产生式,并检查是否存在左递归。如果找到了左递归,它将使用新的非终结符替换左递归,并生成新的产生式。然后,它将使用新的非终结符和产生式替换原始的非终结符和产生式。最后,它输出消除左递归后的产生式。
用C语言写一个消除文法左递归的代码
以下是一个简单的C语言代码示例,用于消除文法中的左递归:
```
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 100
int main() {
char prod[MAX_SIZE][MAX_SIZE], nonTerm[MAX_SIZE];
int n, i, j, k;
printf("Enter the number of productions: ");
scanf("%d", &n);
printf("Enter the productions: \n");
for(i=0; i<n; i++) {
scanf("%s", prod[i]);
}
printf("Enter the non-terminal: ");
scanf("%s", nonTerm);
for(i=0; i<n; i++) {
if(prod[i][0] == nonTerm[0]) {
char alpha[MAX_SIZE] = "", beta[MAX_SIZE] = "";
int flag = 0;
for(j=2; j<strlen(prod[i]); j++) {
if(prod[i][j] == '|' || j == strlen(prod[i])-1) {
if(j == strlen(prod[i])-1) {
strncat(beta, &prod[i][j], 1);
}
if(flag == 0) {
strcat(alpha, &prod[i][j+1]);
flag = 1;
} else {
strcat(beta, &prod[i][j+1]);
}
}
}
printf("%c' -> %s%c'\n", nonTerm[0], beta, nonTerm[0]);
for(j=0; j<n; j++) {
if(prod[j][0] == nonTerm[0]) {
char newProd[MAX_SIZE] = "";
strcat(newProd, alpha);
strcat(newProd, "'");
strcat(newProd, "|");
strcat(newProd, prod[j]+2);
printf("%c -> %s\n", nonTerm[0], newProd);
} else {
printf("%s\n", prod[j]);
}
}
printf("%c' -> epsilon\n", nonTerm[0]);
break;
}
}
if(i == n) {
printf("No left recursion found!\n");
}
return 0;
}
```
这个程序接受用户输入的文法产生式和非终结符,并使用以下算法消除文法中的左递归:
1. 扫描每个产生式,如果它的左部与输入的非终结符相同,则将其分解为两个子串 alpha 和 beta,其中 beta 开头的符号与输入的非终结符相同。
2. 使用新的非终结符替换原始产生式的左部,并生成两个新的产生式,一个是新的非终结符和 beta,另一个是新的非终结符和 alpha 后跟新的非终结符的符号。
3. 如果原始产生式右部结束,那么添加一个新的产生式,将新的非终结符替换为 epsilon。
这个程序只处理一个左递归的情况,如果文法中有多个左递归,需要对每个左递归运行该程序。