我想在一行中获取多个整数和字符串,例如“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 纸
我想在一行中获取多个整数和字符串,例如“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 纸
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. 应为生产级代码添加它。
这是我的解决方案
#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;
}