arrays - 如果用户输入将字符串留空,则默认为先前分配的奇怪行为 [已解决]
问题描述
我有一个函数可以替换文件中的特定单词/行/短语。
使用以下内容,我允许用户在遇到“ ”提示时只需按 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 ”解决了这个问题。
解决方案
推荐阅读
- spring-mvc - 我们能否在不生成或使用队列中的绑定文件的情况下将我的 Java-Spring-mvc 服务连接到 IBM MQ
- c# - C# 下载保存在我的服务器上的文件选项
- mongodb - MongoDB 不会安装在 Windows 10 上(本地用户)
- python - 如何在对象的 JSON 字段中创建一个数组?
- java - Rxjava 在检索然后更新数据库中的项目时创建一个循环
- java - JAVA Code to print SQL Server to CSV returns with incomplete data
- notepad++ - 将当前活动文件与 NPP 文件夹同步为工作区树视图
- postgresql - Count entities by date that fall between start date and end date (postgres)
- python - Ansible use return value as dictionary
- sharepoint - UnauthorizedAccessException for limited permissions user via REST API