atoi函数从缓冲区添加数字

时间:2016-02-13 12:02:23

标签: c buffer concatenation atoi

我尝试在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;
}

2 个答案:

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

......关注细节......