0:
#include <stdio.h>
int main()
{
char str[1024];
char *p = str; // 用于间接寻址
char *pos[1024] = {0};
int len = 0;
int cChar = 0, cWord = 0; // cChar统计字符数,cWord统计单词数
int max = 0, i = 0, j;
printf("请输入一个英文句子:");
// 接收输入,顺带统计用户实际输入了多少字符
while((str[len++] = getchar()) != '\n' && len + 1 < 1024)
;
str[len-1] = '\0'; // str[len]存放的是'\n',将其替换为'\0'
if (*p != ' '){
pos[i++] = p; //记录第一个单词的地址
cWord++;
}
while(len--){
if (*p++ == ' '){
// 判断最大字符数
max = cChar > max ? cChar : max;
cChar = 0;
// 到底了,退出循环
if (*p == '\0'){
break;
}
// 单词数加一
if (*p != ' '){
pos[i++] = p;
cWord++;
}
}
else { // 没有else会把空格统计进去
cChar++;
}
}
max = --cChar > max ? cChar : max; // 最后会算多一个'\0',所以减去
// 申请可变长数组,max+1,否则'\0'放不下
char result[cWord][max+1];
// 将分割好的单词放进二维数组里
for (i = 0; i < cWord; i++){
for (j = 0; *(pos[i]+j) != ' ' && *(pos[i]+j) != '\0'; j++){
result[i][j] = *(pos[i]+j);
}
result[i][j] = '\0';
}
// 打印结果
printf("分割结果已存放到result[%d][%d]的二维数组中...\n",cWord,max+1);
printf("现在依次打印每个单词:\n");
for (i = 0; i < cWord; i++){
printf("%s\n",result[i]);
}
return 0;
}
1:
#include <stdio.h>
int main()
{
char str[1024];
char *p = str; // 用于间接寻址
char *pos[1024] = {0}; // 将分割后的每个字符串的一个字符的地址存储
int len = 0; // 用于计算输入字符的个数
int i = 0, max = 0, j;
int cWord = 0, cChar = 0; // cWord用于存储分割后的字符串的个数,cChar用于计算字符串的字符个数
char s; // 定义分隔符
printf("请输入一个英文句子:");
while((str[len++] = getchar()) != '\n' && len + 1 < 1024)
;
str[len-1] = '\0'; // 由于getchar接收的结尾是'\n',将'\n'替换为'\0'方便后续操作
// 让用户输入分割符
printf("请输入分隔符:");
scanf("%c",&s);
if (*p != s){
pos[i++] = p; // 判断输入的句子第一个字符是否为空格
cWord++;
}
while(len--){
if (*p++ == s){
max = cChar > max ? cChar : max; // 判断最大的字符个数
cChar = 0; // 清零
if (*p == '\0'){
break; // 字符串结尾了,跳出循环
}
if (*p != s){ //此时的*p已经是++之后的p了,所以如果不是分隔符,那就是下一个字符串开始的那个字符的地址
pos[i++] = p;
cWord++;
}
} else {
cChar++; // 没有else会将空格也记录进去,统计字符的个数
}
}
max = --cChar > max ? cChar : max; // 由于最后会多一个'\0'所以要减去
// 定义变长数组 max+1,否则装不下'\0'
char result[cWord][max+1];
// 动态的往result数组中输入字符串
for (i = 0; i < cWord; i++){
for (j = 0; *(pos[i]+j) != s && *(pos[i]+j) != '\0'; j++){ // *(pos[i]+j),因为pos数组中存储的是每个字符串最开始的那个字符,
result[i][j] = *(pos[i]+j); // 所以pos[i]就是那个字符的地址,而+j就是在那个字符的地址上进行偏移,得到整个字符串
}
result[i][j] = '\0'; // 添加结束符
}
// 打印字符串
printf("分割好的字符串已经存储到result[%d][%d]二维数组中\n",cWord,max+1);
printf("现在开始依次打印字符串...\n");
for (i = 0; i < cWord; i++){
printf("%s\n",result[i]);
}
return 0;
}