Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何从字符串中扫描未知数量的元素?_C_Arrays_Scanf - Fatal编程技术网

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"),

我试图从一个字符串中扫描多个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"), 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++;
}