顶级太阳 发表于 2022-10-2 22:16:41

s1e26动动手第0题,为什么不能正确输出?

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

题目要求如下:

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

程序实现如下:
分割后的结果存放在 result 二维数组中,这个二维数组的尺寸是根据用户输入的单词长度而定的(再次提醒:不能使用 malloc 等没学过的知识噢~)

不论是一个空格还是多个空格,你的程序都能够正确识别出单词来:



我的代码:
#include<stdio.h>
int main()
{
char a={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;
result=a;
printf("分割结果已存放到result[%d][%d]的二维数组中...\n",m,n);
printf("现在依次打印每个单词:\n");
for(i=0;i<m;i++)
{
        printf("%s\n",result);
}
return 0;
}


运行结果如下:

输出的数组数值正确,说明存储没有问题。但是不能正确输出。求教原因。

jackz007 发表于 2022-10-2 22:57:30

本帖最后由 jackz007 于 2022-10-2 23:22 编辑

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

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

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

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

D:\\C>

顶级太阳 发表于 2022-10-3 10:21:15

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

jackz007 发表于 2022-10-2 22:57
最要命的问题是,用来储存所有字符串的一维数组的容量为 char a,把它改为 char a 试试看 ...

好奇怪,这次m怎么不变了?问题在哪里,看不明白。请教。
#include<stdio.h>
int main()
{
char a={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;
result=a;                        //为符合题目,同时将句子分割为单词
printf("分割结果已存放到result[%d][%d]的二维数组中...\n",m,n);
printf("现在依次打印每个单词:\n");
for(i=0;i<m;i++)                        //格式输出
{
        printf("%s\n",result);
}
return 0;
}



jackz007 发表于 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={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 , * q                                                ;
      for(p = a , i = 0 ; i < m ; i ++) for(q = result ; (* q ++ = * p ++) ;) ;
      printf("分割结果已存放到result[%d][%d]的二维数组中...\n" , m , n + 1)      ;
      printf("现在依次打印每个单词:\n")                                       ;
      for(i = 0 ; i < m ; i ++) printf("%s\n" , result)                     ;
}

howzyao 发表于 2022-10-3 11:32:57

(你只能 #include <stdio.h>)
回去了,就试试这个要求下,看能不能做到:
0分割字符串。

用户输入一个英文句子,你的程序将这个字符串按空格进行分割,返回由单词组成的二维数组。

howzyao 发表于 2022-10-3 11:35:15

意思是不是把英语句子
I love, fish c. //16个char
缩成了这样
Ilovefishc. //12个char

顶级太阳 发表于 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!算一个。
那么我就理解为每两个空格之间作为一个需要提取的单体。

临时号 发表于 2022-10-3 13:38:12

#include <stdio.h>

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

howzyao 发表于 2022-10-3 15:26:54

临时号 发表于 2022-10-3 13:38


#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 ;
    for(int i=0;i<len;i++)
    {
      p=a;
    }
    p='\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;
    else
      return p;
}



看看,达标了没有.还入得了你的法眼不?

howzyao 发表于 2022-10-3 15:30:31

输入句子:I love FishC.com!
那么结果应该是分出来 I 算一个,love算一个,FishC.com!算一个。
看了,这还不容易,基于了类,就一切很容易,让本师付来小改一下.
稍后发图,并附上改动的代码

两手空空儿 发表于 2022-10-3 16:52:55

result=a;
printf("分割结果已存放到result[%d][%d]的二维数组中...\n",m,n);
只给result赋值了第一个元素,根本就没有做分割,这怎么能有结果呢
结果在字符串a里,不在result里

howzyao 发表于 2022-10-4 00:06:04

顶级太阳 发表于 2022-10-3 13:17
不是这个意思,是从一个英文句子里提取出每两个空格之间的字符,并存储到一个二维数组里。本来题目给的是 ...

#include <stdio.h>

using namespace std;

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

    for(int i=0;i<sizeof(a);i++)
    {
      if(a==32)
      {
            c='0';
            d=a;
      }
      else
      {
            c=a;
            d='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=='0')
            sum=1;
      else
            sum=0;
    }

    printf("sum");

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

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

    delete [] c,d,sum;

    return 0;
}

这回行吗.能不能做到题目要求?

人造人 发表于 2022-10-4 00:10:14

howzyao 发表于 2022-10-4 00:06
这回行吗.能不能做到题目要求?

要求用C语言

howzyao 发表于 2022-10-4 00:12:55

jackz007 发表于 2022-10-2 22:57
最要命的问题是,用来储存所有字符串的一维数组的容量为 char a,把它改为 char a 试试看 ...

最要命的问题是,用来储存所有字符串的一维数组的容量为 char a,把它改为 char a

这么改的话,会不会太长了?他说要最小内存.看看我想的最土的办法,还有没有能更加改进简化的思路.谢谢.

howzyao 发表于 2022-10-4 00:16:48

人造人 发表于 2022-10-4 00:10
要求用C语言

上面的,已改写了,没有用class,应当是纯C吧?
合乎要求吗?也是学系统的补反码的思路启发.

人造人 发表于 2022-10-4 00:33:05

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

要求用C语言 的意思可以理解成是 要求用C语言的编译器编译代码

howzyao 发表于 2022-10-4 22:37:30

人造人 发表于 2022-10-4 00:33
要求用C语言 的意思可以理解成是 要求用C语言的编译器编译代码

要求用C语言的编译器

我用的是GUN GCC Compiler
这个算吗?

人造人 发表于 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";
    intb=0;
    char *c = new char [ sizeof(a)];
    char *d = new char [ sizeof(a)];

    for(int i=0;i<sizeof(a);i++)
    {
      if(a==32)
      {
            c='0';
            d=a;
      }
      else
      {
            c=a;
            d='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=='0')
            sum=1;
      else
            sum=0;
    }

    printf("sum");

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

    //找到空格数,和各段字符数时,就可以创建char a 了;
    // ==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++吗?

人造人 发表于 2022-10-4 22:57:40

howzyao 发表于 2022-10-4 22:37
我用的是GUN GCC Compiler
这个算吗?

另外,GUN 是吗?

howzyao 发表于 2022-10-4 23:02:48

人造人 发表于 2022-10-4 22:55
请告诉我,我哪里做错了




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

谢谢,确实不能.


前面为什么要加上这:

$ ls
main.c
$ cat main.c

后面的使用关键字,空间,也是超出C的范围 了吗?
还有 new
页: [1] 2
查看完整版本: s1e26动动手第0题,为什么不能正确输出?