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 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: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 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) ;
} (你只能 #include <stdio.h>)
回去了,就试试这个要求下,看能不能做到:
0分割字符串。
用户输入一个英文句子,你的程序将这个字符串按空格进行分割,返回由单词组成的二维数组。 意思是不是把英语句子
I love, fish c. //16个char
缩成了这样
Ilovefishc. //12个char howzyao 发表于 2022-10-3 11:35
意思是不是把英语句子
I love, fish c. //16个char
缩成了这样
不是这个意思,是从一个英文句子里提取出每两个空格之间的字符,并存储到一个二维数组里。本来题目给的是要提取每个单词,但是小甲鱼的例子里是这样的:
输入句子:I love FishC.com!
那么结果应该是分出来 I 算一个,love算一个,FishC.com!算一个。
那么我就理解为每两个空格之间作为一个需要提取的单体。
#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;
} 临时号 发表于 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;
}
看看,达标了没有.还入得了你的法眼不? 输入句子:I love FishC.com!
那么结果应该是分出来 I 算一个,love算一个,FishC.com!算一个。
看了,这还不容易,基于了类,就一切很容易,让本师付来小改一下.
稍后发图,并附上改动的代码 result=a;
printf("分割结果已存放到result[%d][%d]的二维数组中...\n",m,n);
只给result赋值了第一个元素,根本就没有做分割,这怎么能有结果呢
结果在字符串a里,不在result里 顶级太阳 发表于 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;
}
这回行吗.能不能做到题目要求?
howzyao 发表于 2022-10-4 00:06
这回行吗.能不能做到题目要求?
要求用C语言
jackz007 发表于 2022-10-2 22:57
最要命的问题是,用来储存所有字符串的一维数组的容量为 char a,把它改为 char a 试试看 ...
最要命的问题是,用来储存所有字符串的一维数组的容量为 char a,把它改为 char a
这么改的话,会不会太长了?他说要最小内存.看看我想的最土的办法,还有没有能更加改进简化的思路.谢谢. 人造人 发表于 2022-10-4 00:10
要求用C语言
上面的,已改写了,没有用class,应当是纯C吧?
合乎要求吗?也是学系统的补反码的思路启发. howzyao 发表于 2022-10-4 00:16
上面的,已改写了,没有用class,应当是纯C吧?
合乎要求吗?也是学系统的补反码的思路启发.
要求用C语言 的意思可以理解成是 要求用C语言的编译器编译代码
人造人 发表于 2022-10-4 00:33
要求用C语言 的意思可以理解成是 要求用C语言的编译器编译代码
要求用C语言的编译器
我用的是GUN GCC Compiler
这个算吗? 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++吗?
howzyao 发表于 2022-10-4 22:37
我用的是GUN GCC Compiler
这个算吗?
另外,GUN 是吗?
人造人 发表于 2022-10-4 22:55
请告诉我,我哪里做错了
你能分清C语言和C++吗?
谢谢,确实不能.
前面为什么要加上这:
$ ls
main.c
$ cat main.c
后面的使用关键字,空间,也是超出C的范围 了吗?
还有 new
页:
[1]
2