bin554385863 发表于 2019-6-25 20:19:28

用结构体使函数返回多个值

#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;
    for (size_t j = 0; j < 26; j++)
    {
      str = (j / 2) > sqrt(j) ? (rand() % 13 + 78) : (rand() % 13 + 110); //给字符串赋值
    }
    str = '\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>

newu 发表于 2019-6-25 20:46:56

两处错误,不知道你的怎么就成功了,
strsch *i; //这是一个结构体指针,不能直接传进去赋值给它
第二处,str数组大小应该是27才对,这样str = '\0'才会没问题。

bin554385863 发表于 2019-6-25 20:50:39

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

{:10_266:}
我也不知道,怎么就成功了

newu 发表于 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 = {0};
        for (size_t j = 0; j < 26; j++)
        {
                str = (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;
}

bin554385863 发表于 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;
    for (size_t j = 0; j < 27; j++)
    {
      str = (j / 2) > sqrt(j) ? (rand() % 13 + 78) : (rand() % 13 + 110); //给字符串赋值
    }
    str = '\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>

-------------------------------------------------------
改正后果然正常了{:10_285:}

bin554385863 发表于 2019-6-25 21:01:14

newu 发表于 2019-6-25 20:56
推荐写法

多谢{:10_256:}

页: [1]
查看完整版本: 用结构体使函数返回多个值