【问题标题】:How to scan an unknown number of elements from a string?如何从字符串中扫描未知数量的元素?
【发布时间】:2013-03-28 02:40:21
【问题描述】:

我正在尝试从一个字符串中扫描多个整数,但我不知道它会有多少,因为它因情况而异。 我想扫描多个数字并将它们放入一个数组中。

我一直在尝试这样做,但它不起作用...... 假设我想从字符串“line”中扫描 C 数字。

for(a=0;a<c;a++)
    sscanf(line, " %d ",&v[a]);

【问题讨论】:

  • 也许使用 strtok 并扫描每个项目?
  • 您的代码看起来不错。我不确定,但是,在开始报价之后和结束报价之前的空格可能是一个问题。
  • 我认为您的问题本身很有趣。但是,您的代码是错误的。您将从行首继续阅读&lt;space&gt;Number&lt;space&gt;。因此,例如,如果您的线路是`1 2 3 4, you will always read 1`。
  • @cipher 我已经尝试过带空格和不带空格的方法...无论哪种方式都行不通。但我明白你在说什么。
  • 我同意shaish的意见,strtok line into section,然后 atoi 每个部分

标签: c arrays scanf


【解决方案1】:

我写了一段代码来帮助你更清楚地理解它。

#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

【讨论】:

【解决方案2】:

假设你有足够的空间来存储整数。

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);
}

【讨论】:

  • 哇。如果我见过,那是对for 循环的滥用! :-D
  • @Joce,哈哈,这是 FreeBSD 关于strtok 的手册页,当我第一次看到它时,我对for 循环有同样的困惑
  • 我试过这样:for(i=0;i
  • @jsantos,我认为你误用了strtok,在切割字符串时,你必须调用strtok(@your cutting string, @separator) first, then loop invoke strtok(NULL, @separator) 来获取剩余的切割字符串。所以你错过了第一个step.Here是手册man7.org/linux/man-pages/man3/strtok.3.html
  • 我的错,我把它写在我的代码上,就像你说的那样,我只是没有把它复制到这里......所以问题仍然存在:(
【解决方案3】:

我终于成功了!感谢您的所有帮助;)

f = fopen(argv[1],"r");
fgets(line,c,f);

line2 = strtok(line, " ");

while (line2 != NULL){

    sscanf(line2, "%d",&v[i]);

    line2=strtok(NULL, " ");
    i++;
}

【讨论】:

  • 老实说,你应该奖励@MYMNeo,给他“批准的复选标记”。他为你做了大部分工作。
  • 对不起,我前几天刚注册,对网站的运作方式不熟悉,但已经完成了! :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多