我想在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
的每次迭代中释放我为所有动态数组分配的内存。
非常感谢提前
答案 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()
你的行