zcmerlin
zcmerlin
采纳率70%
2016-09-02 13:48

C语言,字符串输出问题

已采纳

题目是输入一个字符串,以单词为单位,以空格、逗号或句号为间隔,将字符串倒序输出(不包含标点符号)。
例如:
输入:hello world
输出:world hello

                输入:hello,I am Tom.
                输出:Tom am I hello

我的思路是输入一个字符串,再创建一个二维数组,将单词依次存储在二维数组的每个元素中,再逆序输出,中间间隔一个空格,但是编译通过后,输出有问题,请大家看看哪里错了,谢谢

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char str[101], s[20][20];  //str用于输入字符串,s用来存储字符串
    int n, i, j, count;

    scanf_s("%s", &str);

    i = j = 0;

    for (n = 0; n < strlen(str); n++)
    {
        if (str[n] == '\0')
        {
            break;
        }
        else if (str[n] != ' '&&str[n] != ','&&str[n] != '.')
        {
            s[i][j] = str[n];       
            j++;              //将单词每个字母依次存入列中
        }
        else
        {
            i++;             //记录单词个数
            j = 0;           //初始化列序数
        }
    }

    count = i;   //单词个数
    for (i = count; i >= 0; i--)
    {
        for (j = 0; j < 20; j++)
        {
            printf("%c", s[i][j]);  //倒序依次输出每个单词
        }
        printf(" ");
    }

    system("pause");
    return 0;
}
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

4条回答

  • Wang_1997 嘻嘻兮 5年前

    额。。。醉了,这代码块是什么鬼,我要晕了,粘贴错了代码块,好了。我现在完全明白代码块了,全部重新发一遍,楼主忽略前面的就行

    int main()
    {
        char str[101], s[20][20];  //str用于输入字符串,s用来存储字符串
        int n, i, j, count;
        //这里是第一个问题,使用scanf输入字符串会以空格或回车分隔 
        //scanf("%s", &str);  
        gets(str); 
        i = j = 0;
    
        for (n = 0; n < strlen(str); n++)
        {
            if (str[n] == '\0')
            {
                break;
            }
            else if (str[n] != ' '&& str[n] != ',' && str[n] != '.')
            {
                s[i][j] = str[n];       
                j++;              //将单词每个字母依次存入列中 
            }
            else
            {
                //这里会有第二个问题,字符串会以'\0'作为结束的标识符
                //那么你一行读取往后应当在填充一个'\0'
                s[i][j] = '\0'; 
                i++;             //记录单词个数
                j = 0;           //初始化列序数
            }
        }
        //这里每执行一次完后面的else都会i++,最后一次也不例外,所以要减掉 
        if(str[n-1] == ' ' || str[n-1] == ',' || str[n-1] == '.') 
            i--;
        else//这里因为上面循环中的最后else未执行,使用要补'\0' 
            s[i][j] = '\0';
        count = i;   //单词个数
        for (i = count; i >= 0; i--)
        {
            //这是第三个问题,你能确定每个单词都是20个吗? 
            //for (j = 0; j < 20; j++)
            //{
            //    printf("%c", s[i][j]);  //倒序依次输出每个单词
            //}
            printf("%s",s[i]); //直接以字符串形式输出即可 
            printf(" ");
        }
        return 0;
    }//我为以上程序进行了说明,下面简洁版,去掉这些注释,下面程序进行过测试,无问题 
    

    最终程序

     #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main()
    {
        char str[101], s[20][20];  //str用于输入字符串,s用来存储字符串
        int n, i, j, count;
        gets(str); 
        i = j = 0;
        for (n = 0; n < strlen(str); n++)
        {
            if (str[n] == '\0')
            {
                break;
            }
            else if (str[n] != ' '&& str[n] != ',' && str[n] != '.')
            {
                s[i][j] = str[n];       
                j++;              //将单词每个字母依次存入列中 
            }
            else
            {
                s[i][j] = '\0'; 
                i++;             //记录单词个数
                j = 0;           //初始化列序数
            }
        }   
        if(str[n-1] == ' ' || str[n-1] == ',' || str[n-1] == '.') 
            i--;
        else
            s[i][j] = '\0';
        count = i;   //单词个数
        for (i = count; i >= 0; i--)
        {
            printf("%s",s[i]); //直接以字符串形式输出即可 
            printf(" ");
        }
        return 0;
    }
    

    还有一个问题留给你自己思考,你做的应该是ACM,按照你最后的这样输出每个单词后面都会输出一个空格,但是一般来讲(自己做题来讲),最后一个空格都是不需要的,你在仔细看看题目的需求样例

    点赞 1 评论 复制链接分享
  • Wang_1997 嘻嘻兮 5年前

    /*
    int main()
    {
    char str[101], s[20][20]; //str用于输入字符串,s用来存储字符串
    int n, i, j, count;
    //这里是第一个问题,使用scanf输入字符串会以空格或回车分隔
    //scanf("%s", &str);

    gets(str);
    i = j = 0;

    for (n = 0; n < strlen(str); n++)
    {
        if (str[n] == '\0')
        {
            break;
        }
        else if (str[n] != ' '&& str[n] != ',' && str[n] != '.')
        {
            s[i][j] = str[n];       
            j++;              //将单词每个字母依次存入列中 
        }
        else
        {
            //这里会有第二个问题,字符串会以'\0'作为结束的标识符
            //那么你一行读取往后应当在填充一个'\0'
            s[i][j] = '\0'; 
            i++;             //记录单词个数
            j = 0;           //初始化列序数
        }
    }
    //这里每执行一次完后面的else都会i++,最后一次也不例外,所以要减掉 
    if(str[n-1] == ' ' || str[n-1] == ',' || str[n-1] == '.') 
        i--;
    else//这里因为上面循环中的最后else未执行,使用要补'\0' 
        s[i][j] = '\0';
    count = i;   //单词个数
    for (i = count; i >= 0; i--)
    {
        //这是第三个问题,你能确定每个单词都是20个吗? 
        //for (j = 0; j < 20; j++)
        //{
        //    printf("%c", s[i][j]);  //倒序依次输出每个单词
        //}
        printf("%s",s[i]); //直接以字符串形式输出即可 
        printf(" ");
    }
    return 0;
    

    }我为以上程序进行了说明,下面简洁版,去掉这些注释,下面程序进行过测试,无问题
    */
    #include
    #include
    #include
    int main()
    {
    char str[101], s[20][20]; //str用于输入字符串,s用来存储字符串
    int n, i, j, count;
    gets(str);
    i = j = 0;
    for (n = 0; n < strlen(str); n++)
    {
    if (str[n] == '\0')
    {
    break;
    }
    else if (str[n] != ' '&& str[n] != ',' && str[n] != '.')
    {
    s[i][j] = str[n];

    j++; //将单词每个字母依次存入列中
    }
    else
    {
    s[i][j] = '\0';
    i++; //记录单词个数
    j = 0; //初始化列序数
    }
    }

    if(str[n-1] == ' ' || str[n-1] == ',' || str[n-1] == '.')
    i--;
    else
    s[i][j] = '\0';
    count = i; //单词个数
    for (i = count; i >= 0; i--)
    {
    printf("%s",s[i]); //直接以字符串形式输出即可
    printf(" ");
    }
    return 0;
    }
    //还有一个问题留给你自己思考,你做的应该是ACM,按照你最后的这样输出每个
    //单词后面都会输出一个空格,但是一般来讲(自己做题来讲),最后一个空格都是不需要的,
    //你在仔细看看题目的需求样例

    点赞 2 评论 复制链接分享
  • m_merelyyang m_merelyyang 5年前

    地址从最后往前进行偏移啊,找到空格或者是逗号就输出后面的地址,找到的逗号位就将当前的地址位赋给一个临时地址变量,然后再进行偏移,每次找到了就进行输出。

    点赞 评论 复制链接分享
  • Wang_1997 嘻嘻兮 5年前

    不好意思,没发过几次贴,现在看了下,应该是 代码片 这个拿来发代码的吧。由于我直接粘贴的,所以上述程序有点乱,还好解释说明部分还行。最坑的是为啥没有编辑功能啊,都不能改,醉了。
    我将最后的结果重新发一次
    #include
    #include
    #include
    int main()
    {
    char str[101], s[20][20]; //str用于输入字符串,s用来存储字符串
    int n, i, j, count;
    gets(str);
    i = j = 0;
    for (n = 0; n < strlen(str); n++)
    {
    if (str[n] == '\0')
    {
    break;
    }
    else if (str[n] != ' '&& str[n] != ',' && str[n] != '.')
    {
    s[i][j] = str[n];

    j++; //将单词每个字母依次存入列中
    }
    else
    {
    s[i][j] = '\0';
    i++; //记录单词个数
    j = 0; //初始化列序数
    }
    }

    if(str[n-1] == ' ' || str[n-1] == ',' || str[n-1] == '.')
    i--;
    else
    s[i][j] = '\0';
    count = i; //单词个数
    for (i = count; i >= 0; i--)
    {
    printf("%s",s[i]); //直接以字符串形式输出即可
    printf(" ");
    }
    return 0;
    }
    //还有一个问题留给你自己思考,你做的应该是ACM,按照你最后的这样输出每个
    //单词后面都会输出一个空格,但是一般来讲(自己做题来讲),最后一个空格都是不需要的,
    //你在仔细看看题目的需求样例

    
    
    点赞 评论 复制链接分享