通过函数修改字符串。不明原因的行为

时间:2013-09-22 20:33:21

标签: c string function

本程序应更改后不加字母“不”。喜欢不喜欢 - >不要。 但它显示了一些非常奇怪的输出。 例如,如果我只是跳过打印字符串长度输出是垃圾。我也不能说,在输出中空间如何变为s2ace。如果我不知道更好,我会说我的代码中有鬼。

#include<stdio.h>
#include<string.h>
#include<ctype.h>

int func(char **str, int cur_len, int max_len)
{
    if (cur_len <= 3)
        return(cur_len);
    else if(max_len < cur_len)
        return(-1);

    int i,j;
    char new[max_len];
    new[0]='\0';
    char temp[2];

    for (i = 0; i < cur_len; i++)
    {
        if(i > 0 && i < cur_len - 2 && isalpha((*str)[i-1]) && (*str)[i] == 'n' && (*str)[i+1] == '\'' && (*str)[i+2] == 't')
        {
            strcat(new," not");
            i=i+2;
        }
            else
        {
            temp[0]=(*str)[i];
            temp[1]='\0';
            strcat(new, temp);
        }
    }
    j = strlen(new);
    if (j > max_len)
        return(-1);

    *str = new;
    return(j);

}


int main()
{
    char *x = "Please don't do anything stupid. all the n't followed by an alphabate should be changed to not followed by a space. e.g. doesn't.";
    int len, max, result;
    len = strlen(x);
    printf("String size = %d\n",len);//**if i comment this line all output goes down the drain.**
    max = 200;

    result = func (&x, len, max);
    if(result == -1)
    {
        printf("No change possible\n");
        return(-1);
    }
    printf("No of changes = %d\n",strlen(x)-len);
    printf("New String is :: %s\n",x);//**how does space change into s2ace??**
    return(0);
}

输出

129没有变化= 2 新字符串是::请不要做任何愚蠢的事情。所有未遵循的alphabate应该改为不跟随s2ace。例如没有。

1 个答案:

答案 0 :(得分:0)

使用

替换char new[max_len];,以最少的代码更改解决问题
char *new = *str = (char*)malloc(max_len+1);

您还需要在顶部添加#include <stdlib.h>

如注释中所述,只要函数返回,指向本地对象(带有自动存储类)的指针就会变为无效。

静态对象不会消失,但我不相信允许变长数组是静态的。所以,你坚持使用malloc / calloc。

请务必记录此行为,以便调用函数的作者知道在不再需要内存时释放指针。 (如果你要狡辩说你是作者并已经知道它,我会指出它可以帮助你的代码的读者知道发生了什么。)