分割字符串。用户输入一个英文句子,你的程序将这个字符串按空格进行分割,返回由单词组成 的二维数组。 要求: 返回的二维数组必须尽可能地节省空间(利用C语言的变长数组来实现) 不能使用现成的函数帮忙(你只能#include <stdio.h>)
时间: 2024-10-05 07:02:04 浏览: 44
在C语言中,我们可以手动实现一个简单的函数来分割字符串并返回一个二维字符数组,这里不需要使用现成的库函数。下面是一个示例,我们将通过遍历输入字符串,并遇到空格时存储单词,直到遇到下一个空格或到达字符串结尾:
```c
#include <stdio.h>
#include <stdlib.h> // 为了动态分配内存
// 动态分配二维数组
void* myMalloc(size_t rows, size_t cols) {
void *ptr = malloc(rows * sizeof(char*) + rows * cols);
if (ptr != NULL) {
char **array = (char **)ptr;
for (size_t i = 0; i < rows; ++i) {
array[i] = ((char *)(ptr + sizeof(char*) + i * cols)) + cols;
}
return array;
} else {
printf("Memory allocation failed.\n");
exit(1); // 如果内存分配失败,打印错误并退出
}
}
// 分割字符串并返回二维数组
char** splitString(char* input) {
int wordCount = 0; // 记录单词的数量
char currentWord[100]; // 存储当前单词
char** result = myMalloc(1, 100); // 初始空间假设最多100个单词
for (int i = 0; input[i] != '\0'; ++i) {
if (input[i] == ' ') { // 当找到空格时
if (wordCount > 0) { // 如果不是第一个空格
result[wordCount - 1][strlen(result[wordCount - 1])] = '\0'; // 结束当前单词
}
wordCount++; // 增加单词计数
} else if (input[i] != '\n') { // 跳过换行符
currentWord[wordCount++] = input[i]; // 将字符添加到当前单词
}
}
if (wordCount > 0) { // 如果有最后一个单词,记得结束它
result[wordCount - 1][strlen(result[wordCount - 1])] = '\0';
}
if (wordCount == 0) { // 如果没有单词,释放内存并返回NULL
free(result);
return NULL;
}
// 如果实际需要的单词数小于100,填充剩余的空间
for (size_t i = wordCount; i < 100; ++i) {
result[i] = NULL;
}
return result;
}
int main() {
char input[] = "This is a sample sentence.";
char** words = splitString(input);
if (words != NULL) {
for (int i = 0; words[i] != NULL; i++) {
printf("%s\n", words[i]);
}
free(words); // 释放内存
}
return 0;
}
```
在这个例子中,我们首先检查输入是否为空,然后遍历字符串,每遇到一个空格就存储一个单词,直到遇到字符串结尾。注意这只是一个基础版本,对于大型输入或性能要求更高的场景,可能会需要优化。
阅读全文