我已经用 C 写了一个应用程序,它需要两行输入。第一行输入告诉数组的大小(整数),第二行输入包含由空格分隔的值。例如,以下是输入示例:
5
1 2 3 4 99
应该创建一个包含{1,2,3,4,99}
的数组。
最快的方法是什么?我的问题是读取多个数字而不必循环整个字符串来检查它是空格还是数字?
谢谢。
int i, size;
int *v;
scanf("%d", &size);
v = malloc(size * sizeof(int));
for(i=0; i < size; i++)
scanf("%d", &v[i]);
在完成后记得使用free(v)
!
另外,如果由于某种原因您已经有了数字的字符串表示形式,可以使用sscanf()
这里的'N'是数组'A'的元素数量。
int N, A[N];
printf("Input no of element in array A: ");
scanf("%d", &N);
printf( "You entered: %d\n", N);
printf("Input array A elements in one line: ");
for(int i=0; i<N; i++){
fscanf(stdin, "%d", &A[i]);
printf( "A[%d] is: %d\n", i, A[i]);
}
int main(){
int size = 5, i = 0;
char str[] ="10,20,43,1,576";
int list[size];
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str,",");
list[i] = atoi(pch);
i++;
while (pch != NULL)
{
pch = strtok (NULL, ",");
if(pch != NULL)
list[i] = atoi(pch);
i++;
}
for(i=0;i<size;i++){
printf("%d. %d\n",i+1,list[i]);
}
return 0;
}
scanf()
有点麻烦。针对这种问题,可以尝试使用strtol()
,它会让你的生活变得非常轻松。
fgets()
会读取一行。我不知道为什么你需要strtok()
来解决你的问题。 - Carl Norum这段代码采用了一个简单的方法,通过getchar()读取每个字符。我们继续读取数字,直到找到空格为止。然后更新数组的索引'i'。这个过程重复进行,直到遇到换行符('\n')。
#include<iostream>
main()
{
char ch;
int arr[30] ;
ch =getchar();
int num = 0;
int i=0;
while(ch !='\n')
{
if(ch == ' ')
{
arr[i] = num;
i++;
num = 0;
}
if(((ch -48) >=0) && (ch-48 <=9))
num = (num*10) + (ch - 48);
ch = getchar();
}
arr[i] = num;
for(int j=0;i<=i;j++)
std::cout<<arr[i]<<" ";
}
scanf
,而应该优先使用fgets
与sscanf
。http://c-faq.com/stdio/scanfprobs.html - jamesdlinscanf
的方法,但你必须跳过的所有障碍根本不值得。对于初学者来说,使用fgets
和sscanf
更简单,也更少出现意外情况。 - jamesdlinfgets
是最好的选择。 - Pankaj Dwivediscanf("%d"...
在OP的标题中并没有强制要求输入一行。如果用户输入的格式不符合预期,这种方法在许多方面都会失败,因为它缺乏错误检测。对于初学者来说还可以,但对于良好的编程来说是不够的。 - chux - Reinstate Monica