鱼C论坛

 找回密码
 立即注册
查看: 3769|回复: 23

[已解决]s1e26动动手第0题,为什么不能正确输出?

[复制链接]
发表于 2022-10-2 22:16:41 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 顶级太阳 于 2022-10-2 22:17 编辑

题目要求如下:

0. 分割字符串。用户输入一个英文句子,你的程序将这个字符串按空格进行分割,返回由单词组成的二维数组。
要求:
返回的二维数组必须尽可能地节省空间(利用C语言的变长数组来实现)
不能使用现成的函数帮忙(你只能 #include <stdio.h>)

程序实现如下:
分割后的结果存放在 result 二维数组中,这个二维数组的尺寸是根据用户输入的单词长度而定的(再次提醒:不能使用 malloc 等没学过的知识噢~)
题目图片1.png
不论是一个空格还是多个空格,你的程序都能够正确识别出单词来:
题目图片2.png


我的代码:
#include<stdio.h>
int main()
{
char a[2]={0};
char *p=a;
char ch;
int m=1,n=1;
int i=1,j=1;

printf("请输入一个英文句子:");
while((ch=getchar())!='\n')
{
        if(ch!=32)
        {
                *(p+i-1)=ch;        
                i++;
                j++;
        }
        else
        {
                *(p+i-1)='\0';
                i++;
                j=1;
                if(*(p+i-2)!='\0')m++;
        }
        if(j>n) n=j;
}
char result[m][n];
result[0][0]=a[0];
printf("分割结果已存放到result[%d][%d]的二维数组中...\n",m,n);
printf("现在依次打印每个单词:\n");
for(i=0;i<m;i++)
{
        printf("%s\n",result[i]);
}
return 0;
}

运行结果如下:
提问.jpg
输出的数组数值正确,说明存储没有问题。但是不能正确输出。求教原因。
最佳答案
2022-10-3 16:52:55
result[0][0]=a[0];
printf("分割结果已存放到result[%d][%d]的二维数组中...\n",m,n);
只给result赋值了第一个元素,根本就没有做分割,这怎么能有结果呢
结果在字符串a里,不在result里
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-2 22:57:30 | 显示全部楼层
本帖最后由 jackz007 于 2022-10-2 23:22 编辑

        最要命的问题是,用来储存所有字符串的一维数组的容量为 char a[2],把它改为 char a[2048] 试试看。
#include <stdio.h>

int main(void)
{
        char ch , a[2048]                                                     ;
        int c , d , e , i , j , k , n                                         ;
        printf("请输入一个英文句子:")                                        ;
        for(c = d = e = n = 0 ; (ch = getchar()) != '\n' ;) {
                if(ch == ' ') {
                        if(c) {
                                a[n ++] = ch                                  ;
                                if(c > e) e = c                               ;
                                c = 0                                         ;
                                d ++                                          ;
                        }
                } else {
                        a[n ++] = ch                                          ;
                        c ++                                                  ;
                }
        }
        if(c) {
                if(c > e) e = c                                               ;
                d ++                                                          ;
        }
        char result[d][e + 1]                                                 ;
        for(i = j = k = 0 ; k < n ; k ++) {
                if(a[k] != ' ') {
                        result[i][j ++] = a[k]                                ;
                } else {
                        if(j) {
                                result[i][j] = '\0'                           ;
                                j = 0                                         ;
                                i ++                                          ;
                        }
                }
        }
        if(j) result[i][j] = '\0'                                             ;
        printf("分割结果已存放到result[%d][%d]的二维数组中...\n" , d , e + 1) ;
        printf("现在依次打印每个单词:\n")                                    ;
        for(i = 0 ; i < d ; i ++) printf("%s\n" , result[i])                  ;
}
        编译、运行实况:
D:\[00.Exerciese.2022]\C>g++ -o x x.c

D:\[00.Exerciese.2022]\C>x
请输入一个英文句子:I love FishC.com!
分割结果已存放到result[3][11]的二维数组中...
现在依次打印每个单词:
I
love
FishC.com!

D:\[00.Exerciese.2022]\C>x
请输入一个英文句子:123 aBc    Test   FishC
分割结果已存放到result[4][6]的二维数组中...
现在依次打印每个单词:
123
aBc
Test
FishC

D:\[00.Exerciese.2022]\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-3 10:21:15 | 显示全部楼层
本帖最后由 顶级太阳 于 2022-10-3 10:22 编辑
jackz007 发表于 2022-10-2 22:57
最要命的问题是,用来储存所有字符串的一维数组的容量为 char a[2],把它改为 char a[2048] 试试看 ...


好奇怪,这次m怎么不变了?问题在哪里,看不明白。请教。
#include<stdio.h>
int main()
{
char a[2048]={0};                         //初步定义一维数组,用于存储输入。
char *p=a;
char ch;
int m=1,n=1;                               //定义半固定变量,用于后面定义二维数组
int i=1,j=1;                                  //定义各种循环用变量,随用随变

printf("请输入一个英文句子:");
while((ch=getchar())!='\n')          //讲屏幕输入存入内存
{
        if(ch!=32)
        {
                *(p+i-1)=ch; //存入内容
                i++;             //移动指针用
                j++;             //计算单词长度
        }
        else
        {
                *(p+i-1)='\0';  //将空格改为单词的结束符
                i++;             //指针后移
                j=1;             //重置单词长度
                if(*(p+i-2)!='\0')m++;  //计算单词数量,且用于后面二维数组行数定义
        }
        if(j>n) n=j;                  //计算最长单词长度,且用于后面二维数组列数定义
}
char result[m][n];
result[0][0]=a[0];                          //为符合题目,同时将句子分割为单词
printf("分割结果已存放到result[%d][%d]的二维数组中...\n",m,n);
printf("现在依次打印每个单词:\n");
for(i=0;i<m;i++)                          //格式输出
{
        printf("%s\n",result[i]);
}
return 0;
}


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

使用道具 举报

发表于 2022-10-3 11:19:44 | 显示全部楼层
本帖最后由 jackz007 于 2022-10-3 16:11 编辑
顶级太阳 发表于 2022-10-3 10:21
好奇怪,这次m怎么不变了?问题在哪里,看不明白。请教。

#include<stdio.h>

int main(void)
{
        char a[2048]={0}                                                           ;
        char * p                                                                   ;
        char ch                                                                    ;
        int m=1,n=1                                                                ;
        int i=1,j=1                                                                ;
        printf("请输入一个英文句子:")                                             ;
        for(p = a , j = m = n = 0 ; (ch = getchar()) != '\n' ;) {
                if(ch != 32) {
                        * p ++ = ch                                                ;
                        * p = '\0'                                                 ;
                        if(! j) m ++                                               ;
                        j ++                                                       ;
                        if(j > n) n = j                                            ;
                } else {
                        if(j) {
                                j = 0                                              ;
                                p ++                                               ;
                        }
                }
        }
        char result[m][n + 1] , * q                                                ;
        for(p = a , i = 0 ; i < m ; i ++) for(q = result[i] ; (* q ++ = * p ++) ;) ;
        printf("分割结果已存放到result[%d][%d]的二维数组中...\n" , m , n + 1)      ;
        printf("现在依次打印每个单词:\n")                                         ;
        for(i = 0 ; i < m ; i ++) printf("%s\n" , result[i])                       ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-3 11:32:57 From FishC Mobile | 显示全部楼层
(你只能 #include <stdio.h>)
回去了,就试试这个要求下,看能不能做到:
0分割字符串。

用户输入一个英文句子,你的程序将这个字符串按空格进行分割,返回由单词组成的二维数组。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-3 11:35:15 From FishC Mobile | 显示全部楼层
意思是不是把英语句子
I love, fish c. //16个char
缩成了这样
Ilovefishc. //12个char
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-3 13:17:21 | 显示全部楼层
howzyao 发表于 2022-10-3 11:35
意思是不是把英语句子
I love, fish c. //16个char
缩成了这样

不是这个意思,是从一个英文句子里提取出每两个空格之间的字符,并存储到一个二维数组里。本来题目给的是要提取每个单词,但是小甲鱼的例子里是这样的:
输入句子:I love FishC.com!
那么结果应该是分出来 I 算一个,love算一个,FishC.com!算一个。
那么我就理解为每两个空格之间作为一个需要提取的单体。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-3 13:38:12 | 显示全部楼层
#include <stdio.h>

int main()
{
    int i=0,j=0,max=0,p=0,s1,s2;
    char a[1024];
    printf("请输入一个英文句子:");
    for (char ch=getchar();ch!='\n';ch=getchar())
    {
        a[p++] = ch;
        if (ch!=' ') i++;
        else
        {
            j++;
            if (max < i) max = i;
            i=0;
        }
    }
    a[p++] = '\0';
    if (max < i) max = i;
    char result[j+1][max+1];
    s1=j+1;
    s2=max+1;
    for (p=0,i=0,j=0;a[p]!='\0';p++)
    {
        if (a[p]!=' ') result[j][i++] = a[p];
        else
        {
            result[j][i++] = '\0';
            i=0;
            j++;
        }
    }
    printf("分割结果已存放到result[%d][%d]的二维数组中...\n",s1,s2);
    printf("现在依次打印每个单词:\n");
    for (i=0;i<s1;i++) printf("%s\n",result[i]);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-3 15:26:54 | 显示全部楼层

#include <stdio.h>

using namespace std;

class chars
{
    int len;
    char *p;
public:
    chars();
   ~chars();
    chars(char*,int l);

   void disp();
   void disp_detail();

   char choice(int);
};



int main()
{
    char input[]= ";lkjasfdlsj sdf";

    chars a(input,sizeof(input));
    a.disp();
    a.disp_detail();
    printf( "%c",a.choice(15) );

    return 0;
}
chars:: chars():len(0),p(0)
{
    ;
}

chars:: ~chars()
{
    delete [] p;
}

chars:: chars(char*a,int b):len(b)
{
    p=new char [b];
    for(int i=0;i<len;i++)
    {
        p[i]=a[i];
    }
    p[len]='\n';
}

void chars :: disp()
{
    printf("%s\n",p);
}

void chars:: disp_detail()
{
    printf("存储字符串的首地址: %p\n",p);
    printf("存储的字符串:       %s\n",p);
    printf("存储字符串的长度:   %d\n",len-1);
}

char chars::choice(int I)
{
    if(I<len && I>-1 && I!=0)
        return p[I-1];
    else
        return p[0];
}

sshot-1.png

看看,达标了没有.还入得了你的法眼不?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-3 15:30:31 | 显示全部楼层
输入句子:I love FishC.com!
那么结果应该是分出来 I 算一个,love算一个,FishC.com!算一个。
看了,这还不容易,基于了类,就一切很容易,让本师付来小改一下.
稍后发图,并附上改动的代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-3 16:52:55 | 显示全部楼层    本楼为最佳答案   
result[0][0]=a[0];
printf("分割结果已存放到result[%d][%d]的二维数组中...\n",m,n);
只给result赋值了第一个元素,根本就没有做分割,这怎么能有结果呢
结果在字符串a里,不在result里
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-4 00:06:04 | 显示全部楼层
顶级太阳 发表于 2022-10-3 13:17
不是这个意思,是从一个英文句子里提取出每两个空格之间的字符,并存储到一个二维数组里。本来题目给的是 ...
#include <stdio.h>

using namespace std;

int main()
{
    char a[]= "U12a 34b, 56c";
    int  b=0;
    char *c = new char [ sizeof(a)];
    char *d = new char [ sizeof(a)];

    for(int i=0;i<sizeof(a);i++)
    {
        if(a[i]==32)
        {
            c[i]='0';
            d[i]=a[i];
        }
        else
        {
            c[i]=a[i];
            d[i]='0';
        }
        b++;
    }
    c[ sizeof(a)]='\n';
    d[ sizeof(a)]='\n';

    printf("共有%d个字符:\n",b);
    printf("c == %s\n",c);
    printf("d == %s",d);  // d尾部自带'\n'

    int *sum = new int [ b ];

    for(int i=0;i<b;i++)
    {
        if(d[i]=='0')
            sum[i]=1;
        else
            sum[i]=0;
    }

    printf("sum  ");

    for(int i=0;i<b;i++)
    printf("%d",sum[i]);

    //找到空格数,和各段字符数时,就可以创建char a[x][y] 了;
    // ==0 && ==1 时,一定是字符 y列就可以读入字符;
    // ==0 && ==32时,一定是空格,是空格,x行,就可以换行了;

    delete [] c,d,sum;

    return 0;
}

这回行吗.能不能做到题目要求?
sshot-2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-4 00:10:14 | 显示全部楼层
howzyao 发表于 2022-10-4 00:06
这回行吗.能不能做到题目要求?

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

使用道具 举报

发表于 2022-10-4 00:12:55 | 显示全部楼层
jackz007 发表于 2022-10-2 22:57
最要命的问题是,用来储存所有字符串的一维数组的容量为 char a[2],把它改为 char a[2048] 试试看 ...
最要命的问题是,用来储存所有字符串的一维数组的容量为 char a[2],把它改为 char a[2048]


这么改的话,会不会太长了?他说要最小内存.看看我想的最土的办法,还有没有能更加改进简化的思路.谢谢.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-4 00:16:48 | 显示全部楼层

上面的,已改写了,没有用class,应当是纯C吧?
合乎要求吗?也是学系统的补反码的思路启发.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-4 00:33:05 | 显示全部楼层
howzyao 发表于 2022-10-4 00:16
上面的,已改写了,没有用class,应当是纯C吧?
合乎要求吗?也是学系统的补反码的思路启发.

要求用C语言 的意思可以理解成是 要求用C语言的编译器编译代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-4 22:37:30 | 显示全部楼层
人造人 发表于 2022-10-4 00:33
要求用C语言 的意思可以理解成是 要求用C语言的编译器编译代码
要求用C语言的编译器


我用的是GUN GCC Compiler
这个算吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-4 22:55:48 | 显示全部楼层
howzyao 发表于 2022-10-4 22:37
我用的是GUN GCC Compiler
这个算吗?



请告诉我,我哪里做错了

$ ls
main.c
$ cat main.c
#include <stdio.h>

using namespace std;

int main()
{
    char a[]= "U12a 34b, 56c";
    int  b=0;
    char *c = new char [ sizeof(a)];
    char *d = new char [ sizeof(a)];

    for(int i=0;i<sizeof(a);i++)
    {
        if(a[i]==32)
        {
            c[i]='0';
            d[i]=a[i];
        }
        else
        {
            c[i]=a[i];
            d[i]='0';
        }
        b++;
    }
    c[ sizeof(a)]='\n';
    d[ sizeof(a)]='\n';

    printf("共有%d个字符:\n",b);
    printf("c == %s\n",c);
    printf("d == %s",d);  // d尾部自带'\n'

    int *sum = new int [ b ];

    for(int i=0;i<b;i++)
    {
        if(d[i]=='0')
            sum[i]=1;
        else
            sum[i]=0;
    }

    printf("sum  ");

    for(int i=0;i<b;i++)
    printf("%d",sum[i]);

    //找到空格数,和各段字符数时,就可以创建char a[x][y] 了;
    // ==0 && ==1 时,一定是字符 y列就可以读入字符;
    // ==0 && ==32时,一定是空格,是空格,x行,就可以换行了;

    delete [] c,d,sum;

    return 0;
}
$ gcc --version
gcc (GCC) 12.2.0
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ gcc -g -Wall -o main main.c
main.c:3:1: error: unknown type name ‘using’
    3 | using namespace std;
      | ^~~~~
main.c:3:17: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘std’
    3 | using namespace std;
      |                 ^~~
main.c: In function ‘main’:
main.c:9:15: error: ‘new’ undeclared (first use in this function)
    9 |     char *c = new char [ sizeof(a)];
      |               ^~~
main.c:9:15: note: each undeclared identifier is reported only once for each function it appears in
main.c:9:19: error: expected ‘,’ or ‘;’ before ‘char’
    9 |     char *c = new char [ sizeof(a)];
      |                   ^~~~
main.c:10:19: error: expected ‘,’ or ‘;’ before ‘char’
   10 |     char *d = new char [ sizeof(a)];
      |                   ^~~~
main.c:33:20: error: expected ‘,’ or ‘;’ before ‘int’
   33 |     int *sum = new int [ b ];
      |                    ^~~
main.c:52:5: error: ‘delete’ undeclared (first use in this function)
   52 |     delete [] c,d,sum;
      |     ^~~~~~
main.c:52:13: error: expected expression before ‘]’ token
   52 |     delete [] c,d,sum;
      |             ^
$ ls
main.c
$


你能分清C语言和C++吗?

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

使用道具 举报

发表于 2022-10-4 22:57:40 | 显示全部楼层
howzyao 发表于 2022-10-4 22:37
我用的是GUN GCC Compiler
这个算吗?

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

使用道具 举报

发表于 2022-10-4 23:02:48 | 显示全部楼层
人造人 发表于 2022-10-4 22:55
请告诉我,我哪里做错了
你能分清C语言和C++吗?


谢谢,确实不能.


前面为什么要加上这:

$ ls
main.c
$ cat main.c

后面的使用关键字,空间,也是超出C的范围 了吗?
还有 new
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 00:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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