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;
}