我有一个字符串,例如" 101 1 13"我需要将它拆分为int aux [3] - >导致aux [0] = 101,aux [1] = 1,aux [2] = 13(在这种情况下)。怎么能 我这样做?
在下面的代码示例中,我将op作为String并希望获得INT的值。每个int在字符串中用空格分隔("")。
另一个细节:我需要用标志-std = c99编译代码,所以接受的答案不起作用。
#include <stdio.h>
#include <stdlib.h>
//example of str = "101 1 14" (char *)
// example of output = {101, 1, 14}(int *)
int* stoi(char *str) {
// function to split str into 3 ints
}
int main() {
char op[10];
int num[3];
scanf("%s\n", op);
num = stoi(op);
printf("%d %d %d", num[0], num[1], num[2]);
return 0;
}
答案 0 :(得分:2)
首先,您需要对输入进行标记(将输入拆分为不同的元素)。然后,您需要通过将各个标记从字符串转换为所需格式来解析/整合各个标记。
#include <stdio.h>
#include <string.h>
#define BUF_LEN (64)
int main(void)
{
char buf[BUF_LEN] = { 0 };
char* rest = buf;
char* token;
int i = 0;
int iArr[100] = { 0 };
if ( fgets(buf, BUF_LEN, stdin) != NULL )
{
strtok(buf, "\n"); // Remove newline from input buffer in case we want to call fgets() again.
while ( (token = strtok_r(rest, " ", &rest)) != NULL )
{
iArr[i] = strtol(token, NULL, 10);
printf("Token %d:[%d].\n", i, iArr[i]);
i++;
}
}
return 0;
}
1231 12312 312 1232 1312
Token 0:[1231].
Token 1:[12312].
Token 2:[312].
Token 3:[1232].
Token 4:[1312].
答案 1 :(得分:1)
尝试通过以下代码替换您的代码。
仅当输入仅包含整数之间的单个空格时,新代码才有效。
您的代码:
while(op[cont] != '\0') {
for(i = 0; op[cont] != ' '; i++, cont++) {
num[i] += op[cont];
}
printf("num[i] = %d\n", num[i]);
}
新代码:
while(op[cont] != '\0')
{
if(op[cont] != ' ')
num[i] = num[i]*10 + (op[cont]- '0');
else
i++;
cont++;
}
答案 2 :(得分:0)
请参阅此示例,了解如何执行此操作:
char string [10] = "101 1 666"
int v [3], n=0, j=0;
int tam = strlen(string);
int current_Len = 0;
for(i=0; i<tam; i++){
//32 = ascii for White space
if(string[i] != 32){
n = n*10 + string[i] - '0';
current_len++;
} else if (current_len > 0){
v[j++] = n;
current_len = 0;
n=0;
}
}
if (current_len > 0){
v[j++] = n;
}
答案 3 :(得分:0)
这个答案假设您在编写代码时知道字符串包含多少整数。它还使用特定的clang / gcc扩展名( typeof ),可能无法移植。但它可能对某人有帮助(我主要是因为我没有什么好处而写的)。
#include <stdio.h>
#include <string.h>
struct {int _[3];} strToInt3(const char (*pStr)[])
{
int result[3] = {0}, *pr = result;
for(register const char *p = *pStr; *p; ++p)
{
if(*p == ' ') ++pr;
else
*pr *= 10,
*pr += *p - '0';
}
return *(__typeof__(strToInt3(0)) *)result;
}
int main()
{
char op[10];
int num[3];
scanf("%10[^\n]", op),
//memcpy(num, strToInt3(op)._, sizeof(num));
//or
*(__typeof__(strToInt3(0)) *)num = strToInt3(op);
printf("%d %d %d", num[0], num[1], num[2]);
}
我评论了使用memcpy复制返回的数组并添加了结构赋值。虽然两者都必须有效(我认为不是标准,但在大多数情况下工作)我更喜欢第二种选择(也许是一些编译器优化器)。
我还假设为字符设置了ASCII字符集。
答案 4 :(得分:0)
我找到了一个更容易解决问题的方法。我插入一个scanf,它不会捕获空间毯并使用atoi转换它。因为只有3个整体,所以使用这种简单,重复的方法来捕捉价值并不会变得如此糟糕。它适用于我需要使用的-std = c99标志。
scanf("%s[^ ]\n", op);
num[0] = atoi(op);
scanf("%s[^ ]\n", op);
num[1] = atoi(op);
scanf("%s[^ ]\n", op);
num[2] = atoi(op);
printf("%d\n", num[0]);
printf("%d\n", num[1]);
printf("%d\n", num[2]);