首页 > 解决方案 > 如果用户输入将字符串留空,则默认为先前分配的奇怪行为 [已解决]

问题描述

我有一个函数可以替换文件中的特定单词/行/短语。

使用以下内容,我允许用户在遇到“ ”提示时只需按 ENTER 键即可“删除”或“替换为空”。Replacement :

我希望它能够工作,因为用户的这个操作似乎返回了一个长度字符串0,这是我可以测试的条件,然后基本上分配\0给它的第 0元素。

if(strlen(replace)==0)
    replace[0]='\0';

然而,令人惊讶的是,如果用户曾经用非空替换替换某些东西,比如说"she"to "he",那么如果他们选择一个目标,比如说被申请;被应用 !,因此用户现在将其替换为!而不是删除"Jane"replacement[]"Jane""he"

似乎只要替换循环不止一次迭代就会发生这种情况,基本上只要存在先前分配的值来恢复。

char replace[]在循环中定义的,所以我不太明白为什么会发生这种情况,因为它确实超出了范围,并且在每次迭代时都会重新创建,但也许它没有被破坏......不过,这对我来说还是很莫名其妙的,而且我对C相当陌生,所以也许我缺少一些明显的东西。

看看变量是如何声明的:

while(...){
        FILE * rep = fopen("...","r");FILE * tmp = fopen("...","w");
        if(rep==NULL||tmp==NULL){
            perror("\n Error "); break;
        }
        else{
            /*
               gets target word and replacement
            */
            if (strlen(target)==0){
                printf("\n Target cannot be blank.\n"); continue;
            if(strlen(replace)==0)
                replace[0]='\0';
            replace(rep,tmp,target,replace); // function which replaces target with replace and writes it all to tmp
            /*
                 Rename/remove+rename tmp as source file + Ask user to quit/continue
            */
            ...
       }
}

以及我如何接受输入 char replace[]

char replace[MAX_LN]; lscan(replace);eat();

在哪里 :

#define MAX_LN 10000
#define LN_LIM 9999
void eat()
{
    int eat;while ((eat = getchar()) != '\n' && eat != EOF);
}
int lscan(char *line){
    int give = scanf("%9999[^\n]", line);
    return give;
}

编辑 :

“只需更改char replace[MAX_LN];char replace[MAX_LN] = "";,它就会起作用。解释是您需要在读取输入之前替换一个空行。– 4386427 ”解决了这个问题。

标签: arrayscstringvariablesmemory

解决方案


推荐阅读