我正在尝试实现标题中所述的功能。我认为我非常接近解决方案,但存在问题。
输入:51% 被录取。输出:x:51(空)
但输出应该是:
s:% 被录取。
我的尝试在这里:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int str2int(int);
int isdigit(int);
long str2double(int);
int driver(char *, char *);
int main(){
char *s = "51% are admitted.";
char *sPtr;
int x = driver(s, sPtr);
printf("x:%d sPtr:%s", x, sPtr);
return 0;
}
int isdigit(int ch){
return (ch>=48 && ch<=57)?1:0;
}
int str2int(int ch){
return ch-48;
}
int driver(char *s, char *sPtr){
int i=0, number=0;
while(s[i]!='\0' && isdigit(s[i])){
number = number*10 + str2int(s[i]);
i++;
}
sPtr=s+i;
printf("%s\n", sPtr);
return number;
}
问题是,在主函数中,sPtr 似乎为空,但在驱动程序函数中,sPtr 是 % 被承认,这是它应该是的。如何解决问题,以便在不使用驱动程序函数中的 printf 语句的情况下正确打印解决方案?
编辑:
问题正如@Johnny Mopp 所说,我试图传递该变量的副本。因此,我需要传递在原型中出现 char **sPtr 的 *sPtr 变量的地址。代码应该是:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int str2int(int);
int isdigit(int);
long str2double(int);
int driver(char *, char **);
int main(){
char *s = "51% are admitted.";
char **sPtr;
int x = driver(s, &sPtr);
printf("x:%d sPtr:%s", x, sPtr);
return 0;
}
int isdigit(int ch){
return (ch>=48 && ch<=57)?1:0;
}
int str2int(int ch){
return ch-48;
}
int driver(char *s, char **sPtr){
int i=0, number=0;
while(s[i]!='\0' && isdigit(s[i])){
number = number*10 + str2int(s[i]);
i++;
}
*sPtr=s+i;
return number;
}
感谢@Johnny Mopp 和@paulsm4 的贡献