我尝试在1232 11232
之类的空白之间取两个整数(小于40000),然后将其解析为整数。您可以理解getfirstnum
返回第一个数字。但问题是有些不寻常的事我无法理解。当我输入11232 22312
作为输入时,输出必须相同11232 22312
,但它是2231211232 223121232
。它基本上将第二个数字放在第一个数字的前面,它连接两个数字,在第二个数字中连接最后4个数字。为什么以及如何解决它?
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;
}
答案 0 :(得分:1)
您的代码显示数字值与位数之间存在重大混淆。您的代码失败,因为您在从源复制数字后不终止缓冲区。但是您的代码对于任务而言过于复杂:使用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;
}
答案 1 :(得分:0)
愚蠢的错误:)
num2的调试语句引起了混乱。
#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++;
}
num1[i] = '\0'; /* null terminate string */
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++;
printf("debugging of num2\n"); /* your statements without newline... */
while (i<strlen(input)){
num2[j] = input[i];
printf("%c", num2[j]);
i++;
j++;
}
num2[j] = '\0'; /* null terminate string */
printf("end debugging of num2\n");
num = atoi(num2);
return num;
}
......关注细节......