鱼C论坛

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

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

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

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

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

x
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <math.h>
  4. #include <time.h>
  5. /*在字符串内查找一个字符,并输出其出现的次数和下标 */
  6. typedef struct
  7. {
  8.     int index;
  9.     int count;
  10. } strsch;
  11. strsch *strch(char str[], char key, strsch *s) //定义一个返回值为结构体指针的函数
  12. {
  13.     int cnt = 0;    //保存字符出现的次数
  14.     int inx = 0;    //保存字符首次出现的下标
  15.     char *p = NULL; //初始化临时指针
  16.     p = str;
  17.     for (size_t i = 0; *(p + i) != '\0'; i++)
  18.     {
  19.         if (*(p + i) == key)
  20.         {
  21.             cnt++; //判断字符出现的次数
  22.         }
  23.     }
  24.     for (size_t i = 0; *(p + i) != '\0'; i++)
  25.     {
  26.         if (*(p + i) == key)
  27.         {
  28.             inx = i; //判断字符首次出现的下标
  29.             break;
  30.         }
  31.     }
  32.     if (cnt < 1) //字符不存在的情况
  33.     {
  34.         cnt = -1;
  35.         inx = -1;
  36.     }
  37.     s->index = inx;
  38.     s->count = cnt;
  39.     return s;
  40. }
  41. int main(int argc, char const *argv[])
  42. {
  43.     strsch *i;
  44.     char c;
  45.     srand(time(NULL));
  46.     char str[26];
  47.     for (size_t j = 0; j < 26; j++)
  48.     {
  49.         str[j] = (j / 2) > sqrt(j) ? (rand() % 13 + 78) : (rand() % 13 + 110); //给字符串赋值
  50.     }
  51.     str[26] = '\0'; //手动添加结束字符
  52.     printf("字符串:\n%s", str);
  53.     printf("\n");
  54.     scanf("%c", &c);
  55.     strch(str, c, i);
  56.     printf("字符:%c\n出现次数: %d\n出现位置: %d", c, i->count, i->index);
  57.     return 0;
  58. }
复制代码

================================================

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
我也不知道,怎么就成功了

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

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

  18.         for (size_t i = 0; *(p + i) != '\0'; i++)
  19.         {
  20.                 if (*(p + i) == key)
  21.                 {
  22.                         cnt++; //判断字符出现的次数
  23.                 }
  24.         }
  25.         for (size_t i = 0; *(p + i) != '\0'; i++)
  26.         {
  27.                 if (*(p + i) == key)
  28.                 {
  29.                         inx = i; //判断字符首次出现的下标
  30.                         break;
  31.                 }
  32.         }
  33.         if (cnt < 1) //字符不存在的情况
  34.         {
  35.                 cnt = -1;
  36.                 inx = -1;
  37.         }
  38.         s->index = inx;
  39.         s->count = cnt;
  40.         return s;
  41. }

  42. int main(int argc, char const *argv[])
  43. {
  44.         char c;
  45.         strsch t;
  46.         strsch *i;
  47.         srand(time(NULL));
  48.         char str[27] = {0};
  49.         for (size_t j = 0; j < 26; j++)
  50.         {
  51.                 str[j] = (j / 2) > sqrt(j) ? (rand() % 13 + 78) : (rand() % 13 + 110); //给字符串赋值
  52.         }
  53.         printf("字符串:\n%s", str);
  54.         printf("\n");
  55.         scanf("%c", &c);
  56.         i = strch(str, c, &t);
  57.         printf("字符:%c\n出现次数: %d\n出现位置: %d", c,  i->count, i->index);
  58.         return 0;
  59. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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-5-20 18:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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