题目要求:
要求用二维数组储存输入的英文句子,颠倒句子中的单词输出,当遇到句号、问号或感叹号这些“终止符号”时,需要将符号置于最后。
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函数读取字符串可以很方便地解决空格问题,但是本人初步使用了一下,出现了很多问题,见第二个代码
要求用二维数组储存输入的英文句子,颠倒句子中的单词输出,当遇到句号、问号或感叹号这些“终止符号”时,需要将符号置于最后。
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 <stdio.h> #include <string.h> #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 < COUNT_WORDS; i++) { for (j = 0; j < LENGTH_WORD; ) { 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 < COUNT_WORDS; 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了一个元素
2.你需要为每个元素都malloc空间(感觉题主没有很好理解指针数组的概念)
3.最后多puts了一个元素
#include <stdio.h> #include <string.h> #include <stdlib.h> #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 < COUNT_WORDS; 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
表示:指向数组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.可能需要根据某些变量才能分配空间(可以省空间)
相当于你存了很多个字符串(相似二维数组,但和二维稍有区别,每个字符串占据的空间可以不同)
2.可以不添,原因是scanf(” %s”, sentence[i]);会自动帮你补上”\0″
3.scanf(” %s”, sentence[i]);是不能读入回车符的.
strlen是以读到”\0″来计算字符串长度的,“abcdef\n”是7和不能读入回车符并没有什么关系
4.可以啊
5.动态分配好处很多,1.动态分配的空间都是在堆上的,空间够大(相比于栈) 2.可能需要根据某些变量才能分配空间(可以省空间)