我试图在空白之间取2个整数(小于40000)1232 11232
,然后将其解析为整数。如您所知,getfirstnum
返回第一个数字。但是问题在于,有些不寻常的事情我无法理解。当我输入11232 22312
为输入时,输出必须相同,11232 22312
但必须相同2231211232 223121232
。它基本上将第二个数字放在第一个数字的前面,将两个数字连接起来,在第二个数字中将最后四个数字连接起来。为什么以及如何解决呢?
PS:我用正则表达式输入以空格输入(空格是问题scanf
),它显然有效,我检查了很多次。问题开始于atoi
在正确atoi
解析字符串之前。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int getfirstnum(char *input);
int getsecnum(char *input);
int main() {
char *input = malloc(40005 * sizeof(char));
int N, target, i = 0, j = 0, x, y, shot = 0, found = 0;
scanf(" %[^\n]s", input);
N = getfirstnum(input);
target = getsecnum(input);
printf("%d %d", N, target);
}
int getfirstnum(char *input) {
int numm, i = 0;
char num1[40005];
while (input[i] != ' ') {
num1[i] = input[i];
i++;
}
fflush(stdout);
numm = atoi(num1);
return numm;
}
int getsecnum(char *input) {
int num, i = 0, j = 0;
char num2[40005];
while (input[i] != ' ')
i++;
i++;
while (i < strlen(input)) {
num2[j] = input[i];
printf("%c", sayi2[j]);
i++;
j++;
}
num = atoi(num2);
return num;
}
您的代码显示数字值和位数之间的主要混淆。您的代码失败,因为在从源中复制数字后,您不可以将终止缓冲区的值设置为null。但是您的代码对于此任务而言太复杂了:使用sscanf()
或可以轻松完成数字解析strtol()
。您只需要一个缓冲区即可读取一行:
#include <stdio.h>
int main() {
char line[256];
int N, target;
if (fgets(line, sizeof line, stdin)) {
if (sscanf(line, "%d%d", &N, &target) == 2) {
printf("%d %d\n", N, target);
}
}
return 0;
}
或使用strtol
:
#include <stdio.h>
#include <stdlib.h>
int main() {
char line[256];
int N, target;
char *p, *q;
if (fgets(line, sizeof line, stdin)) {
N = strtol(line, &p, 10);
target = strtol(p, &p, 10);
if (p > line && q > p)
printf("%d %d\n", N, target);
}
return 0;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句