【发布时间】:2020-05-22 07:46:59
【问题描述】:
这是一个删除文件中特定行的程序。它复制所需的行并将其打印到同一目录中的另一个文件中。除了incompatible pointer type [-Wincompatible-pointer-types] 之类的警告外,我没有收到任何错误。当我运行代码时,我也得到了prtintf 语句,但输入时输入Segmentation fault (core dumped)。它与警告有关还是其他原因?
代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#include <ctype.h>
char *name_find(char *buf[], char *name[]) {
const char *p = NULL;
size_t len = strlen(name);
if (len > 0) {
for (p = buf ; (p = strstr(p, name)) != NULL; p++) {
if (p == buf || !isalnum((unsigned char)p[-1])) {
if (!isalnum((unsigned char)p[len]))
break; /* we have a match! */
p += len; /* next match is at least len+1 bytes away */
}
}
}
return p;
}
int main()
{
char name[25];
char buf[100];
setenv("PFILE","/home/ashwin/Desktop/FILE/",1);
char ori_path[100],new_path[100];
if (!getenv("PFILE")){
}
else{
strcpy(ori_path, getenv("PFILE"));
strcpy(new_path, getenv("PFILE"));
strcat(ori_path, "shadow");
strcat(new_path, "shadow1");
}
bool success=false;
printf("Enter the command\n ");
printf("userdel ");
FILE *fold = fopen(ori_path, "r"); // old file
FILE *fnew = fopen(new_path, "w"); // new temp file
fgets(name,25,stdin);
for(int i = 0; i < strlen(name); i++)
{
if(name[i] == '\n')
{
name[i] = '\0';
break;
}
}
while (fgets(buf, 100, fold)) {
// read lines until error or EOF
if (!name_find(buf, name)) {
fprintf(fnew, "%s", buf);
success=true;
}
}
if(success){
printf("Success !!!\n");
}
return 0;
}
【问题讨论】:
-
如果您将编译器警告视为您不会后悔的错误,那么首先要做的就是!相信我。你是怎么做的?通过将这些编译器标志添加到编译中。总是使用这些标志: -pedantic -Wconversion -Wall 你检查折叠和 fnew 文件指针了吗?也许其中一个是空的!您应该始终检查 fopen 的返回值
-
什么是输入,什么是预期输出?
-
看看你函数的参数,为什么是
char *name[]而不是char *name? -
预期的输出首先应该打印“成功”,其次应该将所需的行复制到新文件中
-
如果
name不在搜索文件中,我如何退出代码?
标签: c segmentation-fault