我有一个字符串"14 22 33 48"
。我需要将字符串中的每个值插入到数组中的相应位置:
int matrix[5];
这样
matrix[0] = 14;
matrix[1] = 22;
matrix[2] = 33;
matrix[3] = 48;
我该怎么做?
答案 0 :(得分:8)
您可以使用sscanf:
sscanf(val,
"%d %d %d %d",
&matrix[0],
&matrix[1],
&matrix[2],
&matrix[3]
);
答案 1 :(得分:5)
const char *p = input;
int i = 0, len;
while (i < sizeof(matrix)/sizeof(matrix[0])
&& sscanf(p, "%d%n", &matrix[i], &len) > 0) {
p += len;
i++;
}
为了获得额外的功劳,动态重新分配矩阵使其达到需要的大小......
答案 2 :(得分:2)
我建议strtol
,它提供比atoi
或sscanf
更好的错误处理。如果遇到错误的字符或数组中的空间不足,此版本将停止。当然,如果字符串中没有足够的整数来填充数组,那么其余部分将保持未初始化状态。
#include <stdio.h>
#include <stdlib.h>
#define ARRAY_SIZE 5
int main(int argc, char *argv[])
{
/* string to convert */
const char * str = "14 22 33 48";
/* array to place converted integers into */
int array[ARRAY_SIZE];
/* this variable will keep track of the next index into the array */
size_t index = 0;
/* this will keep track of the next character to convert */
/* unfortunately, strtol wants a pointer to non-const */
char * pos = (char *)str;
/* keep going until pos points to the terminating null character */
while (*pos && index < ARRAY_SIZE)
{
long value = strtol(pos, &pos, 10);
if (*pos != ' ' && *pos != '\0')
{
fprintf(stderr, "Invalid character at %s\n", pos);
break;
}
array[index] = (int)value;
index++;
}
}
答案 3 :(得分:1)
C语言中的强健字符串处理绝非易事。
这是一个让我立即想到的程序。使用strtok()
将字符串分解为单个标记,然后使用strtol()
将每个标记转换为整数值。
需要注意的事项:strtok()
修改其输入(在分隔符上写0)。这意味着我们必须传递一个可写字符串。在下面的示例中,我动态创建一个缓冲区来保存输入字符串,然后将该动态缓冲区传递给strtok()
。这可以保证strtok()
在可写内存上运行,作为奖励,我们会保留输入,以备日后需要时使用。
此外,strtol()
允许我们捕捉到错误形成的输入;第二个参数将指向未转换的字符串中的第一个字符。如果该字符不是空格或0,那么该字符串不是有效的整数,我们可以在将它分配给目标数组之前拒绝它。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
/**
* Convert a space-delimited string of integers to an array of corresponding
* integer values.
*
* @param str [in] -- input string
* @param arr [in] -- destination array
* @param arrSize [in] -- max number of elements in destination array
* @param count [out] -- number of elements assigned to destination array
*/
void stringToIntList(char *str, int *arr, size_t arrSize, size_t *count)
{
/**
* The token variable holds the next token read from the input string
*/
char *token;
/**
* Make a copy of the input string since we are going to use strtok(),
* which modifies its input.
*/
char *localStr = malloc(strlen(str) + 1);
if (!localStr)
{
/**
* malloc() failed; we're going to treat this as a fatal error
*/
exit(-1);
}
strcpy(localStr, str);
/**
* Initialize our output
*/
*count = 0;
/**
* Retrieve the first token from the input string.
*/
token = strtok(localStr, " ");
while (token && *count < arrSize)
{
char *chk;
int val = (int) strtol(token, &chk, 10);
if (isspace(*chk) || *chk == 0)
{
arr[(*count)++] = val;
}
else
{
printf("\"%s\" is not a valid integer\n", token);
}
/**
* Get the next token
*/
token = strtok(NULL, " ");
}
/**
* We're done with the dynamic buffer at this point.
*/
free(localStr);
}
int main(void)
{
int values[5];
char *str = "14 22 33 48 5q";
size_t converted;
stringToIntList(str, values, sizeof values / sizeof values[0], &converted);
if (converted > 0)
{
size_t i;
printf("Converted %lu items from \"%s\":\n", (unsigned long) converted, str);
for (i = 0; i < converted; i++)
printf("arr[%lu] = %d\n", (unsigned long) i, arr[i]);
}
else
{
printf("Could not convert any of \"%s\" to equivalent integer values\n", str);
}
return 0;
}