C语言如何提取命令行输入的字符串中的整数,并传递到自定义函数?

比如
键盘输入: gcd(n,m)
⭐**在函数中提取m,n的值并计算结果? (因为有多个整形数值,并且有个','所以这种下面写法无法实现取值。。。。**

    char str[80], digit[80];
    char* ps;
    int i = 0;

    ps = str;
    while (*ps != '\0')
    {
        if (*ps >= '0' && *ps <= '9' || ps==',')
        {
            digit[i] = *ps;    //找到数字,存放到数组digit里
            i++;
        }
        ps++;    //ps指针指向字符串下一个字符
    }
    digit[i] = '\0';    //为了能用%s输出,digit在末尾要加一个结束字符'\0'
    printf("%s\n", digit);
```)

``

**如果要传递m,n,o,q多个整形数据呢?

**
以下是我代码的摘要

 int main(argc,argv[])

char* stdinin = NULL;
stdinin = ufgets(stdin);       //ufgets是自定义函数,类似于fgets
//然后是一些判断是否输入为空等
 if (strncmp(stdinin, "gcd", 3) == 0)
        gcd(m, n);
//----函数-----
void gcd(n, m)
{
    这里并不能直接使用stdinin

}

1个回答

代码我写了,如果有其他需求需要修改一个也没什么,可以很快修改,我也写了详细的注释
还有疑惑也可以交流,如果不是需求,应该也是小的改动。

下面是几次的测试,环境是gcc的,为了方便检查,输出我加入了运算过程
,不需要,你可以去掉,希望能对你有所帮助,空闲时间有点少,写的也就有点乱。

图片说明

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int  gcd(int i,int j)//你需要执行的函数,可以换的
{
    printf("%d   %d\n",i,j);
    return i+j;
}
int change(char *str)//将一串字符串转换成一个数字
{
    int a[256]={0};
    int i=0;
    int j=0;
    int num=0;
    while(str[i])
    {
        if((str[i]>=48)&&str[i]<=57)
        {
            a[j]=str[i]-48;
            j++;
        }
        i++;
    }
    for(i=0;i<j;i++)
    {
        num=num*10+a[i];
    }
    return num;
}
int main() 
{ 
    char s1[256],s2[256];
    char now_time[256];
    int i,j,key,n,m;
    while(1)
    {
        memset(s1,0,256);
        memset(s2,0,256);
        memset(now_time,0,256);//每次对三个数组进行清零,如果没有学过可以查一下,也是string的基本函数
        key=n=m=0;
        scanf("%s",s1);//输入字符串
        j=strlen(s1);
        if((s1[0]!='g')|(s1[1]!='c')|(s1[2]!='d')|(s1[3]!='(')|(s1[j-1]!=')'))//针对输出格式错误的采取报错忽略
        {
            printf("input error\n");
            continue;
        }
        s1[j+1]=s1[j];
        s1[j]=',';//在最后一个自动添加一个‘,’号,确保每个‘,’前均是一个操作数
        strcpy(s1,&s1[4]);//将输入字符串前进4格,去除前面的格式
        j=strlen(s1);//记录字符串长度,作为后面的结束的判断标志 
        for(i=0;i<=j;i++)
        {
            if(s1[i]!=',')//获取第一个操作数
            {
                now_time[n++]=s1[i];
            }
            else
            {
                n=change(now_time);//将操作数由字符串转为数字
                m=gcd(m,n);//进行操作,第一次m为默认0,你可以自己设置其他不影响gcd函数的值
                //当然你也可以通过加一些其他修改,这样写只是为了方面代码实现,后面的m均表示前面的数字的运算和
                n=0;//操作数清零,等待下一次操作
                memset(now_time,0,256);//获取操作数字符串清零
            }

        }
        printf("end=%d\n",m);//输出最后运算结果
    }
   return 0; 
} 


ss

qq_43635571
dlzy_deft 我在尝试循环取值 赋值 遇到‘)’停止这个思路写看看能不能出来。。
9 个月之前 回复
qq_43635571
dlzy_deft 你是将gcd(里面的数字)全部加起来。。。而我是想把这里面每个‘,’前的数字取出来,分别存放....
9 个月之前 回复
qq_43635571
dlzy_deft 其实最主要的就是取括号里的值, 这个实现了就整体需求达成了
9 个月之前 回复
qq_43635571
dlzy_deft 翻开C语言书。。。我终于知道我卡在哪里了,我把主函数调用函数的时候 直接 gcm(m,n) 这个括号里直接放我的stdinin,然后在函数里面处理这个数据就完事了!!!
9 个月之前 回复
qq_43635571
dlzy_deft while (exit) { stdinin = ufgets(stdin); //首先判断输入字符串是否为空 也不是 exit while (stdinin != NULL && strcmp(stdinin, "exit") != 0) { //从键盘输入的数据stdinin若为空则清除缓存后再次输入 光标不消失 if (strlen(stdinin) == NULL) { stdinin = ufgets(stdin); } else break; //输入非自定义函数时也自动退出 }
9 个月之前 回复
qq_43635571
dlzy_deft 回复@矛盾综合体: 我就是这么循环输入的
9 个月之前 回复
qq_43635571
dlzy_deft 回复@矛盾综合体: 这样的话就不满足需求了,我去看看你的码哈
9 个月之前 回复
qq_43635571
dlzy_deft 回复@矛盾综合体: 对!就是这个意思
9 个月之前 回复
qq_44885018
@矛盾综合体 回复道灵竹雨: stdin标准输入一次,但是可以用一个while(1),输出一次运算后,不断等待输入就可以实现不断输入
9 个月之前 回复
qq_44885018
@矛盾综合体 回复道灵竹雨: 例如gcd(a12,bcd3,45),只需要提取12,3,45
9 个月之前 回复
qq_44885018
@矛盾综合体 回复道灵竹雨: 简单点就是,你输入gcd(x,r,y,z.......)只需要将里面的x,r,y提取出来吗?如果有字母就忽略掉
9 个月之前 回复
qq_43635571
dlzy_deft 没有优先级...而且顺序不重要,实现gcd函数很好算 啊啊啊我就在苦恼,因为在主函数中使用过的变量没法在函数中直接使用,但是stdin键盘数据流只允许输入一次。。。
9 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐