0

我想在一行中获取多个整数和字符串,例如“45 A4 Paper 217”,但我想将字符串 A4 Paper 存储在单个 char 数组中。我尝试使用scanf,但它会扫描到字符串空间。

int int1;
int int2;
char str1[81];
scanf("%d %s %d",&int1,&str1,&int2);

我希望 str1 成为 str1 数组中的 A4 纸

4

2 回答 2

0

scanf家庭函数被称为穷人的解析器。他们可以轻松解析空白分隔的标记,但任何更复杂的东西充其量都是棘手的,甚至是不可能的——更确切地说,应该使用其他工具。

您的要求是在单个字符串中接受任何令牌,直到找到整数令牌(此处的令牌是空白分隔字符串)。这在 single 中是不可能的scanf

如果空白字符的类型和数量无关紧要,您可以使用scanf循环首先尝试查找整数,然后将标记作为字符串:

i = scanf("%d", &int1);      // get first integer
if (i != 1) {
     // error condition
}
char *cur = str1;
for(;;) {
    if (1 == scanf("%d", &int2)) break;    // ok we have found the second integer
    i = scanf("%s", cur);
    if (i != 1) {
         // error condition
    }
    cur += strlen(cur);                   // move cur to end of string
    *cur++ = ' ';                         // and add a space
}
if (cur != str1) {
    cur[-1] = '\0';                       // erase last space
}

这应该检测读取错误,但甚至不会尝试控制str1. 应为生产级代码添加它。

于 2020-05-14T09:19:26.100 回答
0

这是我的解决方案

#include <stdio.h>
#include <string.h>

int main() {
int int1,int2;
char str[100],str1[81];
char *p;
scanf("%[^\n]s",str);
p = strtok (str," ");
sscanf(p, "%d", &int1);
p = strtok (NULL, " ");
strcpy(str1,p);
strcat(str1," ");
p = strtok (NULL, " ");
strcat(str1,p);
p = strtok (NULL, " ");
sscanf(p, "%d", &int2);
printf("%d %s %d",int1,str1,int2);
return 0;
}
于 2020-05-14T09:47:57.923 回答