C 如何从字符串中扫描未知数量的元素?
我试图从一个字符串中扫描多个int,但我不知道它会有多少,因为它因情况而异。 我想扫描多个数字并将它们放入一个数组中 我一直试图这样做,但它不工作。。。 假设我想扫描字符串“line”中的C数字C 如何从字符串中扫描未知数量的元素?,c,arrays,scanf,C,Arrays,Scanf,我试图从一个字符串中扫描多个int,但我不知道它会有多少,因为它因情况而异。 我想扫描多个数字并将它们放入一个数组中 我一直试图这样做,但它不工作。。。 假设我想扫描字符串“line”中的C数字 for(a=0;a假设您有足够的空间存储整数 char * c_num = NULL; for(c_num = strtok(line, " \t\n"), a = 0; c_num != NULL && a < c; c_num = strtok(NULL, " \t\n"),
for(a=0;a假设您有足够的空间存储整数
char * c_num = NULL;
for(c_num = strtok(line, " \t\n"), a = 0; c_num != NULL && a < c; c_num = strtok(NULL, " \t\n"), a++){
v[a] = atoi(c_num);
}
char*c_num=NULL;
对于(c_num=strtok(第“\t\n”行),a=0;c_num!=NULL&&a
我写了一段代码来帮助您更清楚地理解它
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
int v[10];
char buffer[4096];
char * line = NULL;
int i, j;
if(fgets(buffer, 4096, stdin) == NULL){
return -1;
}
for(i = 0, line = strtok(buffer, " "); i < 10; i++){
if(line == NULL){
break;
}
sscanf(line, "%d", &v[i]);
line = strtok(NULL, " ");
}
j = i;
for(i = 0; i < j; i++){
printf("%d\n", v[i]);
}
return 0;
}
[neo]:./a.out
1 2 3 4 5 9999
1
2
3
4
5
9999
#包括
#包括
#包括
内部主(空){
INTV[10];
字符缓冲区[4096];
char*line=NULL;
int i,j;
如果(fgets(缓冲区,4096,标准输入)=NULL){
返回-1;
}
对于(i=0,line=strtok(缓冲区“”);i<10;i++){
如果(行==NULL){
打破
}
sscanf(第%d行和第v[i]);
行=strtok(空,“”);
}
j=i;
对于(i=0;i
我终于搞定了!谢谢大家的帮助;)
也许使用strtok扫描每一项?你的代码看起来很好。我不确定,但开盘后和收盘前的空格可能是个问题。我认为你的问题本身就很有趣。但是,您的代码是错误的。您将从行首继续阅读Number
。例如,如果您的行是'1234,您将始终读取1`.@cipher我已经尝试过使用空格和不使用空格。。。这两种方式都不起作用。但我明白你的意思。我同意shaish的观点,strtok把线分成几个部分,然后每个部分都是原子哇。这是对for
循环的滥用,如果我见过的话!:-D@Joce,哈哈,这是FreeBSD关于strtok的手册页,当我第一次看到它时,我对
循环的
也有同样的困惑,我试过这样做:for(I=0;i@jsantos,我认为您误用了strtok
,在剪切字符串时,您必须调用strtok(@your cutting string,@separator)首先,然后循环调用strtok(NULL,@separator)以获取剩余的剪切字符串。因此,您错过了第一步。这是我的错误手册,正如您所说,我将它写在我的代码上,我只是没有将它复制到这里……所以问题是:(我更喜欢您“可怕地滥用for循环”的答案!!@Joce,这是“常见的”当在一些源代码中时:)老实说,你应该给@MYMNeo一个“批准的复选标记”来奖励他。他为你做了大部分工作。对不起,我几天前刚注册,我不熟悉网站的工作方式,但它已经完成了!:D
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
int v[10];
char buffer[4096];
char * line = NULL;
int i, j;
if(fgets(buffer, 4096, stdin) == NULL){
return -1;
}
for(i = 0, line = strtok(buffer, " "); i < 10; i++){
if(line == NULL){
break;
}
sscanf(line, "%d", &v[i]);
line = strtok(NULL, " ");
}
j = i;
for(i = 0; i < j; i++){
printf("%d\n", v[i]);
}
return 0;
}
[neo]:./a.out
1 2 3 4 5 9999
1
2
3
4
5
9999
f = fopen(argv[1],"r");
fgets(line,c,f);
line2 = strtok(line, " ");
while (line2 != NULL){
sscanf(line2, "%d",&v[i]);
line2=strtok(NULL, " ");
i++;
}