您好我的代码存在问题。我需要它运行,以便如果用户为“fileName”变量输入超过30个字符,它将“返回”;但我下面的代码不起作用。有什么想法吗?
FILE *packetFile; //initialize file handle
char fileName[30]; //initialize
int i;
int length = 0;
length = strlen(fileName);
getchar();
printf("Please enter a file name (Maxium 30 characters): ");
fgets(fileName, 30, stdin);
sscanf(fileName, "%s", fileName);
if(fileName[0] == '\n'){
return;
}
if(strlen(fileName) > 30)
return;
if((packetFile = fopen(fileName,"w"))==NULL) {
printf("Unable to open the file: %s\n",fileName);
} else {
printf("%d packets have been saved to file named %s", pCount, &fileName);
for(i=0;i<pCount;i++) {
fprintf(packetFile,"%04i:%04i:%04i:%04i:%s\r\n",pRecords[i].source,pRecords[i].destination,pRecords[i].type,pRecords[i].port,pRecords[i].data);
}
fclose(packetFile);
}
答案 0 :(得分:4)
多个原因。您只为30个字符分配空间,因此strlen
永远不会返回结果> 30
。您只需在fgets
来电中阅读最多30个字符。
可能的解决方法是开始分配更多空间并使用strlen
。另一个解决方案是保持有限的分配,并使用循环来读取stdin
中的单个字符 - 如果你没有及时到达换行符,你就会爆发并返回。
在POSIX系统上,getline
提供了一个简洁的解决方案。它读取整行,并返回长度。唯一要记住的是getline
在堆上分配内存,所以你需要在完成后释放它。
有些事情:
char *filename = NULL;
size_t linecap = 0; // These initial values tells getline to allocate as much space as needed
ssize_t linelen = getline(&filename, &linecap, stdin);
if (linelen < 0)
...
if (linelen > 30)
// Treat as error or whatever
free(filename);
(无耻地借用手册页)
答案 1 :(得分:0)
char fileName[30+2];//+1 for '\n', +1 for '\0'
int i;
int length = 0;
printf("Please enter a file name (Maxium 30 characters): ");
fgets(fileName, sizeof(fileName), stdin);
if(fileName[0] == '\n'){
return;
}
length = strlen(fileName);
if(fileName[length-1]!='\n'){
return;
}