检查在stdin中读取的行的格式是否为数字^数字

时间:2014-11-03 23:51:34

标签: c string memory-management malloc getline

我想在c中编写一个程序,在getline循环中使用while从stdin读取一行。 如果字符行的格式为“number ^ number”,则计算结果并打印出来。例如,如果用户输入33 ^ 2,那么它将打印1089.所以我想知道如何检查格式是否正确,否则它会向stderr返回错误消息,并且用户必须输入另一行。我知道我必须使用strtol将char转换为long。

另外,我想知道如何使用getline来阅读stdin。我只知道如何使用fgets

以下是我尝试过的代码部分,它不起作用:

#include <stdio.h>
#include <stdlib.h>

long power(long, long);

long power(long x, long y) {

  if (y == 0) {
    return 1;
    }
    else {
    return x*power(x, y-1);
    }
}

int main(void) {

char *line =(char *) malloc(100*sizeof(char));
char *number1=(char *) malloc(100*sizeof(char));
char *number2=(char *) malloc(100*sizeof(char));
long x;
long y;

printf("User please enter The following format number1^number2\n");
int index;
int length;
while(fgets(line, sizeof line, stdin)!= NULL) { // I want to use getline instead
length=strlen(line);
index = strchr(line,"^")-line; //find the index of "^" in the line

if ((index<0) || (index!=0) || (index!= length-1)) {
  fprintf(stderr,"The format is wrong it should be number1^number2\n");
}
else{
for (int i=0; i<index; i++) {
number1[i]=line[i];
}
for (int j=index+1; j<length; j++) {
number1[j]=line[j];
}
x=strtol(number1);
y=strtol(number2);
printf("%ld^%ld = %ld\n",x,y,power(x,y));
}

}



  return EXIT_SUCCESS;
}

我也想知道如何在while的每次迭代中释放我为所有动态数组分配的内存。

非常感谢提前

2 个答案:

答案 0 :(得分:1)

#include <stdio.h>
#include <stdlib.h>

//ssize_t getline(char **linep, size_t *n, FILE *fp);

unsigned long power(unsigned long base, unsigned long exp) {
    unsigned long result = 1;
    while(exp > 0){
        if(exp & 1)
            result = result * base;
        base = base * base;
        exp >>=1;
    }
    return result;//Overflow is not considered
}

int main(void) {
    char *line = NULL;
    size_t size = 0;
    unsigned long x;
    unsigned long y;

    printf("User please enter The following format number1^number2\n");
    while(getline(&line, &size, stdin)!=-1){
        if(2!=sscanf(line, "%lu^%lu", &x, &y)){
            fprintf(stderr,"The format is wrong it should be number1^number2\n");
            continue;
        }
        printf("%lu^%lu = %lu\n", x, y, power(x,y));
    }
    free(line);
    return EXIT_SUCCESS;
}

答案 1 :(得分:0)

您可以使用sscanf()

解析字符串
int res = sscanf(line, "%d^%d", &n1, &n2);

在此之后,您可以检查res var。如果res = 2,则解析正确数量的参数。然后你可以调用你的函数来计算n1 ^ n2。

编辑:你不能投射mallocs。

对于getline:

char *line = null
int n = 0; /* If n = 0 getline will automaticely allocate the right memory */
getline(&line, &n, stdin)

别忘了free()你的行