|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
题目要求:分割字符串。用户输入一个英文句子,你的程序将这个字符串按空格进行分割,返回由单词组成的二维数组
- #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;
- }
复制代码
疑问:第33行,为什么这里可以判断出'\0'?'\0'的前一个字符不应该是非空格字符吗?
你的程序我用 DEV_C++ 运行正常;
getchar()函数是键盘输入函数,其功能是从键盘上输入一个字符。简单来说就是getchar()函数在C程序中的功能是接收一个字符。
用字符串结束符 '\0' 的 ASCII 值正好是 0,用这种方法来判断非数字型字符时,效果是很好的,但若字符串中有数字型字符,就需要使用其他的字符来作为字符串的结束符,这一点是在字符串操作时特别需要注意的。
|
|