如何将字符串拆分为int [3]

时间:2016-02-29 20:29:24

标签: c

我有一个字符串,例如" 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;
    }

5 个答案:

答案 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]);