atoi 函数从缓冲区添加数字
atoi function adds number from buffer
我试着在像1232 11232
这样的空白之间取2个整数(小于40000)然后解析成整数。你可以理解 getfirstnum
returns 第一个数字。但问题是有些不寻常的东西我无法理解。当我输入 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;
}
愚蠢的错误:)
您对 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] = '[=10=]'; /* 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] = '[=10=]'; /* null terminate string */
printf("end debugging of num2\n");
num = atoi(num2);
return num;
}
...注重细节...
您的代码在数值和位数之间存在严重混淆。您的代码失败是因为您在从源中复制数字后没有终止缓冲区。但是您的代码对于这项任务来说太复杂了:使用 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;
}
我试着在像1232 11232
这样的空白之间取2个整数(小于40000)然后解析成整数。你可以理解 getfirstnum
returns 第一个数字。但问题是有些不寻常的东西我无法理解。当我输入 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;
}
愚蠢的错误:)
您对 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] = '[=10=]'; /* 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] = '[=10=]'; /* null terminate string */
printf("end debugging of num2\n");
num = atoi(num2);
return num;
}
...注重细节...
您的代码在数值和位数之间存在严重混淆。您的代码失败是因为您在从源中复制数字后没有终止缓冲区。但是您的代码对于这项任务来说太复杂了:使用 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;
}