我在C中,我应该将数字输入(不知道有多少)格式化为一列而不将它们存储到整数数组中。我无法弄清楚为什么我的代码不会读取输入并输出它。请帮忙。
#include <stdio.h>
#include <stdlib.h>
int main() {
int i;
char *nums[400];
for (i=0; i<nums; i++) {
scanf(nums[i]);
printf( "%.*s", 3, nums[i] );
}
return 0;
}
答案 0 :(得分:0)
你有一个包含400个指针的数组,但你从未初始化它们。相反,您可以声明一个二维数组:
char nums[400][4];
然后您尝试使用nums
作为for
循环的限制。你真正想要的是nums
中的元素数量,即sizeof(nums)/sizeof(nums[0])
;或者您可以定义一个指定数组大小的宏。
接下来,您将格式字符串参数省略为scanf()
。
#include <stdio.h>
#include <stdlib.h>
#declare SIZE 400
int main()
{
int i;
char *nums[SIZE][4];
for(i=0; i<SIZE; i++){
scanf("%3s", nums[i]);
printf( "%.*s", 3, nums[i] );
}
return 0;
}
答案 1 :(得分:0)
由于Baramar正确而彻底地解释了您的主要问题,我想我可能对您的问题有不同的理解。你想要一个给定的数字字符串,例如:2134567896543245678
并将其打印在一个列中,整齐地形成三个数字的行,每个都是这样的:
213
456
789
654
324
567
8
没有间断的整数数组。
这可以像例如:这个
那样完成#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_SIZE 512
int main()
{
int res;
// for the scanf input, set all to '\0'
char buffer[BUFFER_SIZE + 1] = { '\0' }, *idx;
size_t len, i;
// restrict max-size to BUFFER_SIZE
res = scanf("%512s", buffer);
if (res != 1) {
exit(EXIT_FAILURE);
} else {
if (strcmp(buffer, "exit") == 0) {
exit(EXIT_SUCCESS);
}
// TODO: check if the buffer contains all digits
len = strlen(buffer);
idx = buffer;
for (i = len; i >= 3; i -= 3, idx += 3) {
printf("%.3s\n", idx);
}
// last entries, if any
if (*idx != '\0') {
printf("%s\n", idx);
}
}
exit(EXIT_SUCCESS);
}
如果您得到一行中的实际整数,例如:12 3123 23478 34 5456 567456 567 678
,您可以使用类似的内容:
修改强>
在OP评论使用浮点后,我将代码更改为接受表单输入:
24722.319352 51433.662233
56087.991042 49357.684934 67875.375848 68421.563197
54521.615295
22744.470483
38097.001461 80878.250982
92131.575748 7217.137271
20750.671365 7620.695008 37118.391541 28655.609469 46885.110202 87114.202312
46462.577299
20557.716648
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXNUM 400
int main()
{
int res;
int i = 0, m;
// input and two temporary variables
double in, in1, in2;
for (m = 0; m < MAXNUM; m++) {
res = scanf("%lf", &in);
if (res != 1) {
break;
} else {
switch (i) {
case 0:
// set value of first temporary variable to input
in1 = in;
// increment indicator indicating position in output row
i++;
break;
case 1:
in2 = in;
i++;
break;
case 2:
// print the three numbers and a newline
fprintf(stdout, "%f %f %f\n", in1, in2, in);
// reset counter
i = 0;
break;
}
}
}
// if there are still numbers, print them
if (i != 0) {
if (i == 1) {
fprintf(stdout, "%f\n", in1);
} else {
fprintf(stdout, "%f %f\n", in1, in2);
}
}
exit(EXIT_SUCCESS);
}
尝试
$ gcc-4.9 -O3 -g3 -W -Wall -Wextra -std=c11 sc.c -o sc
$ ./sc < floatin
24722.319352 51433.662233 56087.991042
49357.684934 67875.375848 68421.563197
54521.615295 22744.470483 38097.001461
80878.250982 92131.575748 7217.137271
20750.671365 7620.695008 37118.391541
28655.609469 46885.110202 87114.202312
46462.577299 20557.716648
如果输入少于400个条目,则需要以EOF
结束ctrl+d
,这可以在大多数带有-1
的Unix shell中触发,或者设置一个条目来结束条目,例如:undefined
如果你只有正数并检查它是否突破循环。如果您提交上述示例中的文件,则会自动生效。