将带有数字的字符串存储为整数数组

Store string with numbers as an integer array

我正在用 C 编写一个程序,其中有用户输入。此输入是一个字符串,其整数值由 space 分隔。数字(第一个除外)必须存储在整数数组中。第一个数字表示必须存储多少个数字(因此数组的大小)。

在 C 中执行此操作的最简单方法是什么?这是一个例子:

input--> "5 76 35 95 14 20"

array--> {76, 35, 95, 14, 20}

我一直在四处寻找,但找不到解决我的问题的方法。目前,我尝试将输入的值存储在一个字符数组中,当有 space 时,我使用 atoi() 将此字符串转换为整数并将其添加到整数大批。但它打印出奇怪的值。这是代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char text[10];
    scanf("%s", text);

    int nums[4];
    int indNs = 0;

    char lastNum[10];
    int indLN = 0;

    for(int i = 0; i < 10; i++)
    {
        if(text[i] == ' ')
        {
            nums[indNs] = atoi(lastNum);
            indNs++;

            sprintf(lastNum, "%s", "");
            indLN = 0;
        } else
        {
            lastNum[indLN] = text[i];
            indLN++;
        }
    }

    nums[indNs] = atoi(lastNum);

    for(int i = 0; i < 4; i++)
    {
        printf("%d\n", nums[i]);
    }
}

在这种情况下,您可以使用例如在 header <stdlib.h>.

中声明的标准 C 函数 strtol

例如

#include <stdio.h>
#include <stdlib.h>

int main( void )
{
    const char *s = "5 76 35 95 14 20";

    char *p = ( char * )s;

    int n = ( int )strtol( p, &p, 10 );

    int *a = malloc( n * sizeof( int ) );

    for ( int i = 0; i < n; i++ )
    {
        a[i] = strtol( p, &p, 10 );
    }

    for ( int i = 0; i < n; i++ )
    {
        printf( "%d ", a[i] );
    }
    putchar( '\n' );

    free( a );
}

程序输出为

76 35 95 14 20

要读取带空格的字符串,您应该使用标准 C 函数 fgets

您不能使用 scanf 读取 space 分隔的输入,因为 scanf 将在输入白色后停止读取 space。

scanf("%s", text); //Wrong, always reads only first number.

您可以使用 fgets 后跟 sscanf%n 循环。

char buf[100];

int *array = NULL;
int numElements = 0;
int numBytes = 0;
if (fgets(buf, sizeof buf, stdin)) {

   char *p = buf;
   if (1 == sscanf(buf, "%d%n", &numElements,&numBytes)){
       p +=numBytes;
       array = malloc(sizeof(int)*numElements);
       for (int i = 0;i<numElements;i++){
         sscanf(p,"%d%n", &array[i],&numBytes);
         p +=numBytes;
         printf("%d,", array[i]);
       }
   }
}

%n returns number of bytes read so far thus advance the buf number of bytes read so far.


如果您不是在处理 strings 而是直接从 stdin 读取数据,那么您不需要那些乱七八糟的东西。

int *array = NULL;
int numElements = 0;


scanf("%d", &numElements);
array = malloc(sizeof(int)*numElements);

for(int i=0;i<numElements;i++)
{
    scanf("%d", &array[i]);
    printf("%d ", array[i]);
}