我正在尝试在C中实现一个infix到postfix转换程序。我写了(cleanExpression)以下函数来删除给定中缀字符串表达式中不需要的空间。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
#include <string.h>
#define EXPR_LIMIT 1000
bool isNumber(char c) {
return (c >= '0' && c <= '9');
};
bool cleanInfixExpression(char *expr, char **clean) {
*clean = malloc(sizeof(char) * strlen(expr) + 1);
strcpy(*clean, expr);
char *curr = *clean;
char *temp;
char *temp_dest;
// first count the number of terms (numbers and operators).
while (*curr != 0) {
// check if the current position is space.
if (*curr == ' ') {
printf("Current:%s\n", curr);
printf("Clean :%s\n\n", *clean);
// go through all space positions.
for(temp = curr; *temp == ' '; temp++) {};
// make its numbers on both side of the space.
if (curr != *clean && (isNumber(*(curr-1)) && (isNumber(*temp)))) {
printf("\"%s\" : Invalid expression!\n", expr);
free(*clean);
return (false);
}
// copy into the the original string.
strcpy(curr, temp);
}
curr++;
}
printf("Current:%s\n", curr);
printf("Clean :%s\n\n", *clean);
return (true);
};
void main(void) {
char expr[EXPR_LIMIT] = " 214 + 9523 - 235235";
printf("INFIX expression: %s\n", expr);
char *clean;
if (cleanInfixExpression(expr, &clean)) {
printf("%s\n", clean);
}
return;
}
当我运行此代码时,以下是我得到的输出。
INFIX expression: 214 + 9523 - 235235
Current: 214 + 9523 - 235235
Clean : 214 + 9523 - 235235
Current: + 9523 - 235235
Clean :214 + 9523 - 235235
Current: 952 9523 - 235235
Clean :214+ 952 9523 - 235235
Current: 9523 - 235235
Clean :214+952 9523 - 235235
" 214 + 9523 - 235235" : Invalid expression!
但是,如果我将strcpy(curr,temp)更改为以下代码,我手动复制,那么我得到正确的输出。
temp_dest = curr;
while(*temp != 0) {
*(temp_dest++) = *(temp++);
}
*temp_dest = 0;
这个输出让我手动复制字符串,而不是使用strcpy函数。
INFIX expression: 214 + 9523 - 235235
Current: 214 + 9523 - 235235
Clean : 214 + 9523 - 235235
Current: + 9523 - 235235
Clean :214 + 9523 - 235235
Current: 9523 - 235235
Clean :214+ 9523 - 235235
Current: - 235235
Clean :214+9523 - 235235
Current: 235235
Clean :214+9523- 235235
Current:
Clean :214+9523-235235
214+9523-235235
我无法理解我在使用strcpy时犯了什么错误。有人能告诉我可能会发生什么吗?
答案 0 :(得分:2)
您只需删除malloc
cleanInfixExpression
即可删除空格:
这样做
void cleanInfixExpression(char *expr)
{
int r = 0;
int w = 0;
for (; expr[r]; r++) {
if (expr[r] != ' ') {
expr[w] = expr[r];
++w;
}
}
expr[w] = 0;
}
它将从expr中删除不需要的空格
答案 1 :(得分:1)
来自标准:
7.21.2.3 strcpy函数
的描述强>
2 strcpy函数复制s2指向的字符串(包括终止空值) 字符)进入s1指向的数组。 如果在对象之间进行复制 重叠,行为未定义 。
因此,您不能像strcpy
那样重叠字符串。您需要编写自己的strcpy
实现或使用memmove
。