读取、逆向输出英文句子(二维数组存储)遇到的问题

C语言 码拜 8年前 (2016-09-22) 1396次浏览
题目要求:
要求用二维数组储存输入的英文句子,颠倒句子中的单词输出,当遇到句号、问号或感叹号这些“终止符号”时,需要将符号置于最后。
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了一个元素

#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

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)
[1034331897@qq.com]
分享 (0)