Anm*_*ggi 3 c scanf stringstream string-parsing
我想读一个存储在字符串中的空格分隔数字列表.
我知道如何stringstream在C++中使用 - :
string s = "10 22 45 67 89";
stringstream ss(s);
int numbers[100];
int k=0, next_number;
while(ss>>next_number)
numbers[k++]=next_number;
Run Code Online (Sandbox Code Playgroud)
我的问题是我们怎样才能在C中做到这一点?我已经sscanf()在C中读过,但我不确定它在这里是否有用.
使用sscanf()并"%n知道从哪里开始下一次扫描.
char *s = "10 22 45 67 89";
for (k=0; k<100; k++) {
int n;
int cnt = sscanf(s, "%d %n", numbers[k], &n);
if (cnt != 1) break;
s += n;
}
if (*s) Handle_DidNotEndCleanly();
Run Code Online (Sandbox Code Playgroud)
如果你知道字符串中你期望的项目数,你可以sscanf在这里使用:
char const *s = "10 22 45 67 89";
sscanf(s, "%d %d %d %d %d", numbers, numbers+1, numbers+2, numbers+3 numbers+4);
Run Code Online (Sandbox Code Playgroud)
但是,如果您不知道先验项目的数量,则可以尝试对输入进行标记,然后尝试单独转换每个项目.
char s[] = "10 22 45 67 89";
char *n = strtok(s, " ");
do {
numbers[k++] = atoi(n);
} while (n = strtok(NULL, " "));
Run Code Online (Sandbox Code Playgroud)
请注意,它strtok具有相当丑陋的界面 - 它会修改传递给它的字符串,并要求您大致如上所述使用它 - 在第一次调用中传递输入字符串,然后为字符串传递NULL以便后续调用直到你到达字符串的末尾.它在内部存储指向字符串中当前位置的指针,这也使线程安全成为问题.
您还可以使用sscanf与%n转换计数已经转换的字符数,但是这(IMO)在近直接竞争strtok的一些最丑陋的代码想象的,我不能处理在一天内发布两件事情这样.