我正在尝试编写一个通用函数,它将从格式化文本文件中读取参数。我希望它足够灵活,参数列表可以变化。在C中完成此任务的最佳方法是什么?
我几天来一直在努力奋斗。我能够从文件中提取的字符串不是我所期望的。我用来调试的示例文本文件很简单:
Nx : 1600;
Ny : 400;
dx : .524584;
dy : .25;
dt : 1;
我的节目如下。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char * argv[])
{
if(argc!=2)
{
printf("ERROR: Usage: ./Practice3 <input file>");
}
else
{
FILE * fr = fopen(argv[1], "rt");
if(fr == NULL){printf("file %s not found", argv[1]);}
char * tmpstr1 ;
char * tmpstr2 ;
char * delimPtr;
char * endPtr;
int Nx = 0;
int Ny = 0;
double dx = 0;
double dy = 0;
char tempbuff[100];
while(!feof(fr))
{
if (fgets(tempbuff,100,fr)) {
delimPtr = strstr(tempbuff,":");
endPtr = strstr(delimPtr,";");
strncpy(tmpstr1,tempbuff,delimPtr-tempbuff);
strncpy(tmpstr2,delimPtr+2 ,endPtr-delimPtr-2);
printf("<<%s>>\n", tmpstr1);
printf("<<%s>>\n", tmpstr2);
if (strcmp(tmpstr1,"Nx")==0) {
Nx = atoi(tmpstr2);
}
else if (strcmp(tmpstr1,"Ny")==0) {
Ny = atoi(tmpstr2);
}
else if (strcmp(tmpstr1,"dx")==0) {
dx = atof(tmpstr2);
}
else if (strcmp(tmpstr1,"dy")==0) {
dy = atof(tmpstr2);
}
else{
printf("Unrecongized parameter : \"%s\"\n", tmpstr1);
}
}
}
fclose(fr);
printf("\nNx : %d \nNy : %d \ndx : %f \ndy : %f \n", Nx,Ny,dx,dy);
}//end of code executed when input is correct
}
我正在使用gcc -std = c99进行编译。 tmpstr1变量在末尾打印出一个奇怪的blob字符。我不能像现在这样可靠地提取参数名称。什么是更好的方式?
此外,似乎tmpstr2并没有完全被strncpy覆盖,所以数字变得混乱了。似乎C不是设计用于轻松进行这种刺痛操作。但是我必须使用C来上课,所以我被困住了。有什么想法吗?
答案 0 :(得分:2)
char tmpstr1[16];
char tmpstr2[16];
...
/*
delimPtr = strstr(tempbuff,":");
endPtr = strstr(delimPtr,";");
strncpy(tmpstr1,tempbuff,delimPtr-tempbuff-1);
strncpy(tmpstr2,delimPtr+2 ,endPtr-delimPtr-2);
*/
sscanf(tempbuff, "%15s : %15[^;];", tmpstr1, tmpstr2);
答案 1 :(得分:0)
正如John3136所指出的那样,你没有为tempstr1
和tempstr2
分配任何内存。您可能希望将它们定义为tempbuf
,作为堆栈数组。
此外,您滥用strncpy()
:
a)您复制的字符串部分不是以空值终止的,因此memcpy()
在您的情况下是等效的,这将我们带到了
b)您没有空终止符。 strncpy()
如果在被告知要复制的字符数中没有遇到空终结符,则不会添加空终止符。因此,您需要手动设置空终止符:tempstr[n] = '\0'