鱼C论坛

 找回密码
 立即注册
查看: 2037|回复: 5

[已解决]用结构体使函数返回多个值

[复制链接]
发表于 2019-6-25 20:19:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <time.h>
/*在字符串内查找一个字符,并输出其出现的次数和下标 */
typedef struct
{
    int index;
    int count;
} strsch;
strsch *strch(char str[], char key, strsch *s) //定义一个返回值为结构体指针的函数
{
    int cnt = 0;    //保存字符出现的次数
    int inx = 0;    //保存字符首次出现的下标
    char *p = NULL; //初始化临时指针
    p = str;
    for (size_t i = 0; *(p + i) != '\0'; i++)
    {
        if (*(p + i) == key)
        {
            cnt++; //判断字符出现的次数
        }
    }
    for (size_t i = 0; *(p + i) != '\0'; i++)
    {
        if (*(p + i) == key)
        {
            inx = i; //判断字符首次出现的下标
            break;
        }
    }
    if (cnt < 1) //字符不存在的情况
    {
        cnt = -1;
        inx = -1;
    }
    s->index = inx;
    s->count = cnt;
    return s;
}
int main(int argc, char const *argv[])
{
    strsch *i;
    char c;
    srand(time(NULL));
    char str[26];
    for (size_t j = 0; j < 26; j++)
    {
        str[j] = (j / 2) > sqrt(j) ? (rand() % 13 + 78) : (rand() % 13 + 110); //给字符串赋值
    }
    str[26] = '\0'; //手动添加结束字符
    printf("字符串:\n%s", str);
    printf("\n");
    scanf("%c", &c);
    strch(str, c, i);
    printf("字符:%c\n出现次数: %d\n出现位置: %d", c, i->count, i->index);
    return 0;
}
================================================

E:\Administrator\Documents\My C>cmd /C "c:\Users\Administrator\.vscode\extensions\ms-vscode.cpptools-0.23.1\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-ltrxuxdl.yf5 --stdout=Microsoft-MIEngine-Out-4ad1gvxa.e3h --stderr=Microsoft-MIEngine-Error-nqlgwzei.1dy --pid=Microsoft-MIEngine-Pid-bcfkbuyo.ohm --dbgExe=E:\MinGW\bin\gdb.exe --interpreter=mi "
字符串:
ouxvoyQTXNUQNPRQNSPSPYUQTT
o
字符:o
出现次数: 3
出现位置: 0
E:\Administrator\Documents\My C>cmd /C "c:\Users\Administrator\.vscode\extensions\ms-vscode.cpptools-0.23.1\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-smw554iw.nkf --stdout=Microsoft-MIEngine-Out-nykzwlxt.qnm --stderr=Microsoft-MIEngine-Error-gob4nn2o.lis --pid=Microsoft-MIEngine-Pid-odowxlij.cda --dbgExe=E:\MinGW\bin\gdb.exe --interpreter=mi "
字符串:
xnxyvsQOVYSNUTOTUZVNXUXZOT
x
字符:x
出现次数: 3为什么次数总是多一个,头大,找不到问题在哪
出现位置: 0
E:\Administrator\Documents\My C>
最佳答案
2019-6-25 20:46:56
两处错误,不知道你的怎么就成功了,
strsch *i; //这是一个结构体指针,不能直接传进去赋值给它
第二处,str数组大小应该是27才对,这样str[26] = '\0'才会没问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-25 20:46:56 | 显示全部楼层    本楼为最佳答案   
两处错误,不知道你的怎么就成功了,
strsch *i; //这是一个结构体指针,不能直接传进去赋值给它
第二处,str数组大小应该是27才对,这样str[26] = '\0'才会没问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-25 20:50:39 | 显示全部楼层
newu 发表于 2019-6-25 20:46
两处错误,不知道你的怎么就成功了,
strsch *i; //这是一个结构体指针,不能直接传进去赋值给它
第二 ...


我也不知道,怎么就成功了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-25 20:56:08 | 显示全部楼层
bin554385863 发表于 2019-6-25 20:50
我也不知道,怎么就成功了

推荐写法
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <time.h>
/*在字符串内查找一个字符,并输出其出现的次数和下标 */
typedef struct
{
        int index;
        int count;
} strsch;

strsch *strch(char str[], char key, strsch *s) //定义一个返回值为结构体指针的函数
{
        int i;
        int cnt = 0;    //保存字符出现的次数
        int inx = 0;    //保存字符首次出现的下标
        char *p = NULL; //初始化临时指针
        p = str;

        for (size_t i = 0; *(p + i) != '\0'; i++)
        {
                if (*(p + i) == key)
                {
                        cnt++; //判断字符出现的次数
                }
        }
        for (size_t i = 0; *(p + i) != '\0'; i++)
        {
                if (*(p + i) == key)
                {
                        inx = i; //判断字符首次出现的下标
                        break;
                }
        }
        if (cnt < 1) //字符不存在的情况
        {
                cnt = -1;
                inx = -1;
        }
        s->index = inx;
        s->count = cnt;
        return s;
}

int main(int argc, char const *argv[])
{
        char c;
        strsch t;
        strsch *i;
        srand(time(NULL));
        char str[27] = {0};
        for (size_t j = 0; j < 26; j++)
        {
                str[j] = (j / 2) > sqrt(j) ? (rand() % 13 + 78) : (rand() % 13 + 110); //给字符串赋值
        }
        printf("字符串:\n%s", str);
        printf("\n");
        scanf("%c", &c);
        i = strch(str, c, &t);
        printf("字符:%c\n出现次数: %d\n出现位置: %d", c,  i->count, i->index);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-25 20:58:50 | 显示全部楼层
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <time.h>
/*在字符串内查找一个字符,并输出其出现的次数和下标 */
typedef struct
{
    int index;
    int count;
} strsch;
strsch *strch(char str[], char key, strsch *s) //定义一个返回值为结构体指针的函数
{
    int cnt = 0;    //保存字符出现的次数
    int inx = 0;    //保存字符首次出现的下标
    char *p = NULL; //初始化临时指针
    p = str;
    for (size_t i = 0; *(p + i) != '\0'; i++)
    {
        if (*(p + i) == key)
        {
            cnt++; //判断字符出现的次数
        }
    }
    for (size_t i = 0; *(p + i) != '\0'; i++)
    {
        if (*(p + i) == key)
        {
            inx = i; //判断字符首次出现的下标
            break;
        }
    }
    if (cnt < 1) //字符不存在的情况
    {
        cnt = -1;
        inx = -1;
    }
    s->index = inx;
    s->count = cnt;
    return s;
}
int main(int argc, char const *argv[])
{
    strsch i;
    char c;
    srand(time(NULL));
    char str[27];
    for (size_t j = 0; j < 27; j++)
    {
        str[j] = (j / 2) > sqrt(j) ? (rand() % 13 + 78) : (rand() % 13 + 110); //给字符串赋值
    }
    str[26] = '\0'; //手动添加结束字符
    printf("字符串:\n%s", str);
    printf("\n");
    scanf("%c", &c);
    strch(str, c, &i);
    printf("字符:%c\n出现次数: %d\n首次位置: %d", c, i.count, i.index);
    return 0;
}
==================================================================

E:\Administrator\Documents\My C>cmd /C "c:\Users\Administrator\.vscode\extensions\ms-vscode.cpptools-0.23.1\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-rrw5akhh.eky --stdout=Microsoft-MIEngine-Out-5q4jcdig.3ro --stderr=Microsoft-MIEngine-Error-w5bkhmm0.etq --pid=Microsoft-MIEngine-Pid-1qpfbbxk.25x --dbgExe=E:\MinGW\bin\gdb.exe --interpreter=mi "
字符串:
xuwztnTSVNYSYZNNOWRWVYUPVY
x
字符:x
出现次数: 1
首次位置: 0
E:\Administrator\Documents\My C>cmd /C "c:\Users\Administrator\.vscode\extensions\ms-vscode.cpptools-0.23.1\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-1oubivzw.ayi --stdout=Microsoft-MIEngine-Out-onb04m3f.snf --stderr=Microsoft-MIEngine-Error-k0vlxad1.ev1 --pid=Microsoft-MIEngine-Pid-udsj3jy2.xrf --dbgExe=E:\MinGW\bin\gdb.exe --interpreter=mi "
字符串:
xounoyYNOYYTOYVPXPRWWXUQVS
o
字符:o
出现次数: 2
首次位置: 1
E:\Administrator\Documents\My C>

-------------------------------------------------------
改正后果然正常了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-25 21:01:14 | 显示全部楼层

多谢

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 21:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表