0

我正在尝试实现标题中所述的功能。我认为我非常接近解决方案,但存在问题。

输入: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 的贡献

4

0 回答 0