如何在c中读取一个文本文件,然后将每一行拆分为标记?
输入文本文件每行有一些数字,数字按空格分割。前两行只有一个数字,后面几行有三个。我想做的是读取每行输入并存储这些数字 到目前为止,我得到的是:如何在c中读取一个文本文件,然后将每一行拆分为标记?,c,string,pointers,stdin,C,String,Pointers,Stdin,输入文本文件每行有一些数字,数字按空格分割。前两行只有一个数字,后面几行有三个。我想做的是读取每行输入并存储这些数字 到目前为止,我得到的是: int main(int argc, char *argv[]) { int n = 0; char buff[MAX_STRING_LEN]; //MAX_STRING_LEN is defined as 64 while (fgets(buff,MAX_STRING_LEN, stdin
int
main(int argc, char *argv[]) {
int n = 0;
char buff[MAX_STRING_LEN]; //MAX_STRING_LEN is defined as 64
while (fgets(buff,MAX_STRING_LEN, stdin) != NULL) {
char temp;
if (n == 0) {
sscanf(buff, "%s", &temp);
int h_num = (int)temp;
} else if (n == 1) {
sscanf(buff, "%s", &temp);
int s_num = (int)temp;
} else {
sscanf(buff, "%s", &temp);
char *token;
token = strtok(&temp, " ");
int i = 0;
int a,b,c;
while (token != NULL) {
if (i == 0) {
a = (int)token;
token = strtok(NULL, " ");
} else if (i == 1) {
b = (int)token;
token = strtok(NULL, " ");
} else {
c = (int)token;
token = strtok(NULL, " ");
}
i++;
}
}
n++;
}
return 0;
}
我用来测试代码的print语句如下:
printf("%d\n",h_num);
printf("%d\n%d\n%d\n",a,b,c);
我创建了一个如下的文本文件:
23
34
4 76 91
但是输出不是我期望的,我认为是指针的地址。(我又被指针卡住了=()
有人能帮我指出问题所在吗?非常感谢。在您的代码中,我可以看到
int h_num = (int)temp;
及
不,这不是将无音字符串转换为int
的方式
为此,您需要使用
那么
是错误的。temp
是一个char
,您必须使用%c
我建议采取更好的办法:
)作为分隔符对输入进行标记化,然后使用将标记(如果不是NULL)转换为int
在这种情况下,您的代码将更加通用,因为不需要单独考虑每行中存在的
int
s的数量。为什么不使用fscanf(fp、%d、&num)
?用正确的格式字符串调用fscanf
三次就足够了。没有循环,没有strtok
,没有复杂的东西。你的代码有很多问题。sscanf(buff,“%s”&temp);
尝试使用a=(int)将字符串扫描成char
令牌;
etc@CoolGuy似乎fscanf
正在请求一个文件指针,那么我如何使用它来处理每一行?您是否正在重定向来自文件的输入?如果是,请使用fscanf(stdin、%d、&num)
strtol()
为什么不atoi
?@Eregrithstrtol())
更健壮,可以区分有效的0
输入和错误情况。如果您预见这种扩展将在将来识别更多令牌,则会稍微复杂一些(但健壮得多)解决方案是Flex和Bison。或者类似的Lexer/Parser。Windows版本也可用。@SouravGhosh我试图以这种方式使用sscanf
:sscanf(buff,“%d”和&h_num)
。然后我使用printf(“%d”,h_num)
。但当我编译它时,它说h_num
未声明。这有什么意义?@LeaneLi您在if块中声明过。
int s_num = (int)temp;
sscanf(buff, "%s", &temp);