C中的strcpy无法正确复制以覆盖字符串

时间:2016-01-04 17:12:31

标签: c string strcpy

我正在尝试在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时犯了什么错误。有人能告诉我可能会发生什么吗?

2 个答案:

答案 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