C防止超过30个字符输入

时间:2013-12-17 22:31:24

标签: c

您好我的代码存在问题。我需要它运行,以便如果用户为“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);

}

2 个答案:

答案 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;
    }