69,336
社区成员
发帖
与我相关
我的任务
分享
#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]);
free(*sentence);
*sentence = NULL;
编译无error、warning,可是不能理解。
或者使用循环来一个个释放和置空#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LENGTH_WORD 20
#define COUNT_WORDS 30
int main(void)
{
char *sentence[COUNT_WORDS], ch, punctuation;
//问题1:
int i, len, j;
printf("Enter a sentence: ");
for (i = 0; i < COUNT_WORDS; i++) {
sentence[i] = (char *)malloc(LENGTH_WORD * sizeof(char));
if (sentence[i] == NULL) {
printf("allocation failed“)
exit(1);
}
scanf(" %s", sentence[i]);
ch = getchar();
len = strlen(sentence[i]);
sentence[i][len] = '\0'; //问题2:
if (ch == '\n') { //问题3:
if (sentence[i][len - 1] == '.' ||
sentence[i][len - 1] == '\?' ||
sentence[i][len - 1] == '!'
) {
//问题4:
punctuation = sentence[i][len - 1];
sentence[i][len - 1] = '\0';
} //second-if
break;
} //first-if
} //for
for ( ; i > 0; i--)
printf("%s ", sentence[i]);
printf("%s%c", sentence[0], punctuation);
return 0;
}
问题1:在这里我声明的是指针数组,是一维的?我知道可以把二维数组当成一维数组处理,但是我声明的时候本意是需要二维数组,还是一维数组(这莫非是把一维数组当二维数组用?)
问题2:这里需要添加'\0'吗?
问题3:在这里我尝试过if(sentence[i][len - 1] == '\n')但是循环没有在我输入换行符的时候跳出,这是说明在最后的换行符不能储存到字符串中吗?可是“abcdef\n"的字符长度还是7啊
问题4:在判断条件中使用sentence[i][len-1] == '.'&&'\?'&&'!'这种做法怎么样(经测试,结果是正确,有没有隐藏的缺陷)
问题5:“动态分配数组”是指动态分配数组元素的个数?可是这样的作用是什么?为了将声明了但没有初始化的数组元素占据的内存释放?
例子:
声明但没有初始化:
int a[20], i;
for (i = 0; i < 10; i++)
a[i] = i;
声明了也初始化了:
int a[20] = {0}, i;
for (i = 0; i < 10; i++)
a[i] = i;
谢谢啦!
#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]);
}