puts遇到空格无法输出_读取、逆向输出英文句子(二维数组存储)遇到的问题...

题目要求:

要求用二维数组储存输入的英文句子,颠倒句子中的单词输出,当遇到句号、问号或感叹号这些“终止符号”时,需要将符号置于最后。

Enter a sentence: you can cage a swallow can”t you?

Reversal of sentence: you can”t swallow a cage can you?

本人打出了一个感觉不是很好的代码,希望能够帮忙改进一下:

1.解决下面代码中依然存在的缺陷,更简洁的解决办法

2.本人想使用指向字符串的指针的数组来储存输入的句子,原因是刚好用scanf函数读取字符串可以很方便地解决空格问题,但是本人初步使用了一下,出现了很多问题,见第二个代码

#include 

#include 

#define LENGTH_WORD 20

#define COUNT_WORDS 3

//改为3为了方便测试,原因是在第二个代码片中不知道怎么样设置退出循环的条件

int main(void)

{

char sentence[COUNT_WORDS][LENGTH_WORDS + 1] = {0}, ch, punctuation;

//punctuation为终止符号

int i, j;

printf("Enter a sentence: ");

for (i = 0; i 

for (j = 0; j 

ch = getchar();

if (ch != " " && ch != "\n") {

sentence[i][j] = ch;

j++;

}

else {

sentence[i][j] = "\0";

break;

}

}

if (ch == "\n")

break;

}   //以上for循环取值任然有缺陷

//假如之前存在空隔,或单词之间的空格不止一个的话,空格会单独占据一行

punctuation = sentence[i][j - 1];

sentence[i][j - 1] = "\0";  //靠将最后一个标点符号字符另外储存

//再替换为空字符的做法也有缺陷

//假如没有标点符号将无法正确显示

//改进可以使用一个if来判断是不是终止符号

printf("Reversal of sentence:");

for ( ; i > 0; i--)

printf("%s ", &sentence[i]);

printf("%s%c", &sentence[i], punctuation);

return 0;

}

char *sentence[COUNT_WORDS], ch;

int i, len, j;

printf("Enter a sentence: ");

for (i = 0; i 

scanf(" %s", &sentence[i]);

len = strlen(&sentence[i]);

printf("i: %d;len: %d\n", i, len);

//用来检验字符串长度,显示是正确的,但输出时出现奇怪的错误

}

printf("\n");

puts(&sentence[0]);

puts(&sentence[1]);

puts(&sentence[2]);

puts(&sentence[3]);

上面代码本人测试的时候出现了很多问题,主要的问题还是下面这种,其他的还有假如单个单词长度过长,无法执行之类的

执行结果:

————————————————————————

Enter a sentence: apple banana orange

i: 0;len: 5

i: 1;len: 6

i: 2;len: 6

applbanaoran

banaoran

oran

————————————————————————

可以的话请帮帮忙,谢谢!

解决方案

10

方法二使用指针奨要先为指针分配内存

40

1.你的scanf,strlen,puts都不需要取地址,sentence[i]本身就是个指针

2.你需要为每个元素都malloc空间(感觉题主没有很好理解指针数组的概念)

3.最后多puts了一个元素

#include 

#include 

#include 

#define LENGTH_WORD 20

#define COUNT_WORDS 3

int main()

{

char *sentence[COUNT_WORDS], ch;

int i, len, j;

printf("Enter a sentence: ");

for (i = 0; i 

sentence[i] = (char *)malloc(sizeof(char)* LENGTH_WORD);

scanf(" %s", sentence[i]);

len = strlen(sentence[i]);

printf("i: %d;len: %d\n", i, len);

//用来检验字符串长度,显示是正确的,但输出时出现奇怪的错误

}

printf("\n");

puts(sentence[0]);

puts(sentence[1]);

puts(sentence[2]);

//puts(sentence[3]);

}

10

(*sentence)[COUNT_WORDS]这样写表示的是数组指针

表示:指向数组sentence的指针

而你需要的是存放多个字符串的指针数组(指针数组的每个元素都是一个指针)

你可以网上搜搜资料,看下概念。

http://www.cnblogs.com/Romi/archive/2012/01/10/2317898.html

10

1.指针数组中的每个元素都是一个指针,而每个指针指向各自的字符串

相当于你存了很多个字符串(相似二维数组,但和二维稍有区别,每个字符串占据的空间可以不同)

2.可以不添,原因是scanf(” %s”, sentence[i]);会自动帮你补上”\0″

3.scanf(” %s”, sentence[i]);是不能读入回车符的.

strlen是以读到”\0″来计算字符串长度的,“abcdef\n”是7和不能读入回车符并没有什么关系

4.可以啊

5.动态分配好处很多,1.动态分配的空间都是在堆上的,空间够大(相比于栈) 2.可能需要根据某些变量才能分配空间(可以省空间)

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明读取、逆向输出英文句子(二维数组存储)遇到的问题!

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
评论

打赏作者

花儿街参考

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值