标题:关于strcmp比较两个值得问题?输入与输出同一样的数据为什么结果不为0
只看楼主
jenq
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2018-4-9
结帖率:50%
已结贴  问题点数:5 回复次数:3 
关于strcmp比较两个值得问题?输入与输出同一样的数据为什么结果不为0
做一个综合代码的练习?添加好友、增加好友友好度、删除好友、私聊的程序。结果做到2.添加好友友好度就出问题了strcmp被卡住了!求解答?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>     // 支持字符串操作
#define MAX 7
int main()
{   int i;              // 循环变量
    int count=6;        // 当前好友数量(未被删除的好友)
    int choice;         // 选择变量1到4
    char tempname[7];  // 用来存放临时字符串的数组 (输入好友的名字)
    char name[50];      // 使用字符串命名名字
    char friendsname[MAX][20]={"陈一","黄二","张三","李四","王五","赵六"};
    /*1.需要使用数组来表示好友以及好友的各项状态(属性)
        (1)好友的姓名
        (2)好友级别
        (3)好友的友好度*/

    char levelfriends[][10]={"生死之交","忘年之交","异性知己","泛泛之交","一面之交","猪朋狗友"};
    //2. 朋友的级别数组
    int levels[MAX]={0,1,2,3,4,5,-1};
    //3. 用来存放好友的级别,每个数组元素对应每个朋友的当前等级

    int friendly[MAX]={100,80,70,40,30,10,-1};
    //4. 对应每个好友的友好度,自己定义
    printf("\n\t\t\t  好友列表\n");
    printf("===================================================================\n");
    printf("姓名\t\t 级别\t\t友好度\t\n");
    for(i=0;i<count;i++)
    {
        printf("%-15s%s\t%13d\n",friendsname[i],levelfriends[levels[i]],friendly[i]);
    /*   因为levefriendsleves[]被leves[i]={3,5,3,4,1,0,-1}赋值
         levefriends[MAX][10]={"生死之交","忘年之交","异性知己","泛泛之交","一面之交","猪朋狗友" //还有一个字符没有赋值}
         levefreinds元素顺序为:  0     ,     1    ,    2     ,     3    ,   4      ,    5
                      leves[]=[  0     ,     1    ,    2     ,     3    ,   4      ,    5   ,  -1(无效值)]
    levefreinds元素的值被改变为  0     ,     1    ,    2     ,     3    ,   4      ,    5    用数字代表汉子
                              "生死之交","忘年之交","异性知己","泛泛之交","一面之交","猪朋狗友"
    */
    }
    printf("===================================================================\n\n");
    printf("请输入你的名字:");
    scanf("%s",name);
    printf("用户%s登陆成功\n",name);
    printf("选择1.添加好友;\t\t(增加功能)\n");
    printf("选择2.增加友好度;\t(修改状态)\n");
    printf("选择3.删除好友;\t\t(删除功能)\n");
    printf("选择4.单独与好友私聊;\n\n");
    printf("请输入1-4的数字:");
    scanf("%d",&choice);
    switch(choice)
    {
    case 1:
        // 选择1.添加好友要求
        //     1.确认添加好友前,先判断数组有没有空间
        //     2.添加数组元素(friendname,levefriend,leves)
        if(count<MAX)//当前好友的数量小于最大好友数量
        {
             //执行添加好友
             printf("请输入新的朋友姓名:");
             scanf("%s",friendsname[count]);
             //gets(friendsname[count]);
             //将第count个元素初始化
             levels[count]=4;
             //级别初始为0
             friendly[count]=10;
             //友好度初始值为0
             count++;
             printf("\n添加成功!\n\n");
             printf("返回好友列表.\n");
             printf("\t\t\t   好友列表\n");
             printf("===================================================================\n");
             printf("姓名\t\t 级别\t\t友好度\t\n");
             for(i=0;i<count;i++)
             {
              printf("%-15s%s\t%13d\n",friendsname[i],levelfriends[levels[i]],friendly[i]);

             }
             printf("===================================================================\n\n");

        }
        else
        {
            // 添加失败
            printf("好友已满,添加失败!");
        }
        break;
    case 2:
        //选择2.增加友好度;
        //    1.找到好友的下标
        //    2.修这个好友的状态 友好度+10 级别+1 如果达到最高级就不在增加
        //    3.修改其他好友的状态 友好度和级别
        printf("请输入朋友的名字: ");
        scanf("%s",tempname);
        printf("你输入的名字为:%s\n",tempname);
        (strcmp(tempname,friendsname[i]));                         // 附加一个测试代码
        printf("strcmp=%d\n",strcmp(tempname,friendsname[i]));     // 结果输出值为0
        //     字符串寻找strcmp,需要引入<string.h>文件头
        //     <string.h>头文件函数 strcmp 比较两个字符,等于返回0,小于返回负数,大于返回正数。
          for(i=0;i<count;i++)
         {
            if(strcmp(tempname,friendsname[i])==0)

        //    如果输入的姓名与friendsname相等值为真
            {
                friendly[i]+=10;
                levels[i] = levels[i] >= 6 ? 6 : levels[i]+1;
        //     等级不能超过6
             printf("输入正确!\n");
            }
            else
            {
                printf("输入错误!\n");
                friendly[i]-=10;
            }
    printf("返回好友列表.\n");
    printf("\t\t\t   好友列表\n");
    printf("===================================================================\n");
    printf("姓名\t\t 级别\t\t友好度\t\n");
    for(i=0;i<count;i++)
    {
        printf("%-15s%s\t%13d\n",friendsname[i],levelfriends[levels[i]],friendly[i]);

    }
    printf("===================================================================\n");

        }
        break;
    case 3:
        printf("选择3.删除好友;\t\t(删除功能)\n");
        break;
    case 4:
        printf("选择4.单独与好友私聊:\n请选择:");
        break;
    default:
        printf("输入错误,请再选择!\n");
    }

    return 0;
}

程序选择1的结果没问题!选择2到strcmp这个阶段就卡住了
附加一个测试值
 (strcmp(tempname,friendsname[i]));
 printf("strcmp=%d\n",strcmp(tempname,friendsname[i]));
输出结果为strcmp=1,哪里出了问题?




                     
搜索更多相关主题的帖子: strcmp 输入 好友 选择 printf 
2018-04-24 03:51
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:4 
        case 2:
            for(i=0; i<count; i++)
            {
                for(i=0; i<count; i++)
                {
注意这里循环嵌套的 i
2018-04-24 04:12
jenq
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2018-4-9
得分:0 
不明白版主的意思?只要输入对应的值,循环的顺序找不到?
2018-04-24 06:45
jenq
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2018-4-9
得分:0 
回复 版主
#include <stdio.h>
#include <stdlib.h>
#include <string.h>     // 支持字符串操作
#define MAX 7
int main()
{   int i,j,temp;        // 循环变量和临时整形变量
    int searchindex=-1;  // 用来存放查找元素的下标
    int count=6;         // 当前好友数量(未被删除的好友)
    int choice;          // 选择变量1到4
    char tempname[7];    // 用来存放临时字符串的数组 (输入好友的名字)
    char name[50];       // 使用字符串命名名字
    char friendsname[MAX][20]={"陈一","黄二","张三","李四","王五","赵六"};
    /*1.需要使用数组来表示好友以及好友的各项状态(属性)
        (1)好友的姓名
        (2)好友级别
        (3)好友的友好度*/

    char levelfriends[][10]={"生死之交","忘年之交","异性知己","泛泛之交","一面之交","猪朋狗友"};
    //2. 朋友的级别数组
    int levels[MAX]={0,1,2,3,4,5,-1};
    //3. 用来存放好友的级别,每个数组元素对应每个朋友的当前等级

    int friendly[MAX]={100,80,70,40,30,10,-1};
    //4. 对应每个好友的友好度,自己定义
    printf("\n\t\t\t  好友列表\n");
    printf("===================================================================\n");
    printf("姓名\t\t 级别\t\t友好度\t\n");
    for(i=0;i<count;i++)
    {
        printf("%-15s%s\t%13d\n",friendsname[i],levelfriends[levels[i]],friendly[i]);
  
    }
    printf("===================================================================\n\n");
    printf("请输入你的名字:");
    scanf("%s",name);
    printf("用户%s登陆成功\n",name);
    printf("选择1.添加好友;\t\t(增加功能)\n");
    printf("选择2.增加友好度;\t(修改状态)\n");
    printf("选择3.删除好友;\t\t(删除功能)\n");
    printf("选择4.单独与好友私聊;\n\n");
    printf("请输入1-4的数字:");
    scanf("%d",&choice);
    switch(choice)
    {
    case 1:
        // 选择1.添加好友要求
        //     1.确认添加好友前,先判断数组有没有空间
        //     2.添加数组元素(friendname,levefriend,leves)
        if(count<MAX)//当前好友的数量小于最大好友数量
        {
             //执行添加好友
             printf("请输入新的朋友姓名:");
             scanf("%s",friendsname[count]);
             //gets(friendsname[count]);
             //将第count个元素初始化
             levels[count]=4;
             //级别初始为0
             friendly[count]=10;
             //友好度初始值为0
             count++;
             printf("\n添加成功!\n\n");
             printf("返回好友列表.\n");
             printf("\t\t\t   好友列表\n");
             printf("===================================================================\n");
             printf("姓名\t\t 级别\t\t友好度\t\n");
             for(i=0;i<count;i++)
             {printf("%-15s%s\t%13d\n",friendsname[i],levelfriends[levels[i]],friendly[i]);}
             printf("===================================================================\n\n");
        }
        else{printf("好友已满,添加失败!");}
        break;
    case 2:
        //选择2.增加友好度;
        //    1.找到好友的下标
        //    2.修这个好友的状态 友好度+10 级别+1 如果达到最高级就不在增加
        //    3.修改其他好友的状态 友好度和级别
        printf("请输入朋友的名字: ");
        scanf("%s",tempname);
        printf("你输入的名字为:%s\n",tempname);

        //     字符串寻找strcmp,需要引入<string.h>文件头
        //     <string.h>头文件函数 strcmp 比较两个字符,等于返回0,小于返回负数,大于返回正数。
          for(i=0;i<count;i++)
         {

            if(strcmp(tempname,friendsname[i])==0)

        //    如果输入的姓名与friendsname相等值为真
            {
                friendly[i]+=10;
                levels[i] = levels[i] >= 5 ? 5 : levels[i]+1;
        //     等级不能超过6
             printf("输入正确!\n");
            }
            else
            {
                friendly[i]-=10;
            }
    printf("返回好友列表.\n");
    printf("\t\t\t   好友列表\n");
    printf("===================================================================\n");
    printf("姓名\t\t 级别\t\t友好度\t\n");
    for(i=0;i<count;i++)
    {printf("%-15s%s\t%13d\n",friendsname[i],levelfriends[levels[i]],friendly[i]);}
    printf("===================================================================\n");

        }
        break;
    case 3:
         //选择3.删除好友
         //    1.查找要删除的对象
         //    2.后见一个赋给前面一个值
         //    3.总数减1
        printf("请输入要删除的好友:");
        scanf("%s",tempname);
        printf("你要删除好友%s\n",tempname);
        for(i=0;i<count;i++)
        {
            if(strcmp(tempname,friendsname[i])==0)
         // 比较字符串是否相等
            {
                //记录下要寻找的下标
                searchindex=i;
                break;
            }
        }
        if(-1==searchindex)//如果serachindex的初值-1,表示没有找到
        {
            printf("错误没有找到该好友!\n");
        }
        else
        {
            for(i=searchindex;i<count-1;i++)
            {
    //C语言字符数组不支持数组直接赋值 friendsname[i]=friendsname[i];错误
    // 需要时用strcpy函数赋值
             strcpy(friendsname[i],friendsname[i+1]);
             friendly[i]=friendly[i+1];
             levels[i]=levels[i+1];
            }
            count--;
        for(i=0;i<count;i++)
        friendly[i]+=10;
        printf("该好友几删除!\n");
        printf("\n\t\t\t  好友列表\n");
        printf("===================================================================\n");
        printf("姓名\t\t 级别\t\t友好度\t\n");
        for(i=0;i<count;i++)
        {printf("%-15s%s\t%13d\n",friendsname[i],levelfriends[levels[i]],friendly[i]);}
        printf("===================================================================\n");
        }

        break;
    case 4:
        //选择4.单独私聊增加友好度
        //    1.查找
        //    2.增加友好度
        //    3.可以使用
        printf("请输入要私聊的好友:");
        scanf("%s",tempname);
        printf("你要私聊好友%s\n",tempname);
        for(i=0;i<count;i++)
        {
            if(strcmp(tempname,friendsname[i])==0)
         // 比较字符串是否相等
         {
             friendly[i]+=10;
         }

        }
        printf("\n\t\t\t  好友列表\n");
        printf("===================================================================\n");
        printf("姓名\t\t 级别\t\t友好度\t\n");
        for(i=0;i<count;i++)
        {printf("%-15s%s\t%13d\n",friendsname[i],levelfriends[levels[i]],friendly[i]);}
        break;
    default:
        printf("输入错误,请再选择!\n");
    }
   
    //冒泡排序
    for(i=0;i<count-1;i++)
    {
        for(j=0;j<count-i-1;j++)
        {
            if(levels[j]<levels[j+1])
            {
                //统一交换姓名、级别、友好度
                //字符组交换
                strcpy(tempname,friendsname[j]);
                strcpy(friendsname[j],friendsname[j+1]);
                strcpy(friendsname[j+1],tempname);

                temp=levels[j];
                levels[j]=levels[j+1];
                levels[j+1]=temp;

                temp=friendly[j];
                friendly[j]=friendly[j+1];
                friendly[j+1]=temp;
            }
        }
    }
    return 0;
}
选择1.3.4都试过没问题!唯独2.有问题  2与3都是用strcmp配对,3没问题但是2就有问题?   
2018-04-24 06:50



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-486327-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.125054 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved