我正在用C编写一个有用户输入的程序。该输入是一个字符串,整数值之间用空格分隔。数字(第一个数字除外)必须存储在整数数组中。第一个数字表示必须存储多少个数字(即数组的大小)。
在C语言中最简单的方法是什么?这是一个示例:
input--> "5 76 35 95 14 20"
array--> {76, 35, 95, 14, 20}
我一直在搜索,但是找不到我的问题的解决方案。此刻,我试图将输入的值存储在char数组中,并且当有空格时,我使用atoi()
将此字符串转换为整数,并将其添加到integer数组中。但是它会打印出奇怪的值。这是代码:
#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]);
}
}
答案 0 :(得分:3)
您不能使用scanf
来读取空格分隔的输入,因为scanf
一旦碰到空白就会停止读取。
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
返回到目前为止已读取的字节数,因此提前buf
数 到目前为止已读取的字节数。
如果您不处理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]);
}
答案 1 :(得分:2)
在这种情况下,您可以使用例如在标头strtol
中声明的标准C函数<stdlib.h>
。
例如
#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
。