c - 给定两个字符串,找到两个字符串共有的单词

标签 c string c-strings

例如:输入:char *str1 = "the are all is well"; char *str2 = "是谁"; 输出:两个给定字符串中的常用词,返回字符串的二维数组。

#define SIZE 31

char ** commonWords(char *str1, char *str2) {

    int i,j=0,count1,count2,k=0,a,b,m=0,n;
    char str3[100][100], str4[100][100];
    char **output;
    output = (char **)malloc(SIZE*sizeof(char*));
    if (str1 == NULL || str2 == NULL)
    {
        return NULL;
    }
    for (i = 0; str1[i] != '\0'; i++)
    {
        if (str1[i] != ' ')
        {
            str3[j][k++] = str1[i];
        }
        else
        {
            str3[j][k++] = '\0';
            j++;
            k = 0;
        }
    }
    str3[j][k++] = '\0';
    count1 = j > 0 ? j + 1 : j;
    j =  k = 0;
    for (i = 0; str2[i] != '\0'; i++)
    {
        if (str2[i] != ' ')
        {
            str4[j][k++] = str2[i];
        }
        else
        {
            str4[j][k++] = '\0';
            j++;
            k = 0;
        }
    }
    str4[j][k++] = '\0';
    count2 = j > 0 ? j + 1 : j;
    for (i = 0; i < count1; i++)
    {
        for (j = 0; j < count2; j++)
        {
            if (str3[i][k] == str4[j][k])
            {
                if (str3[i][k + 1] == str4[j][k + 1] && str3[i][k + 2] == str4[j][k + 2] == '\0')
                {
                    a = i;
                    b = k;
                    while (str3[a][b] != '\0')
                    {
                        output = (char **)malloc(SIZE*sizeof(char));
                        output[m][n] = str3[a][b];
                        n++;
                        b++;
                    }
                    output[m][n] = '\0';
                }
                else if (str3[i][k + 1] == str4[j][k + 1] && str3[i][k + 2] == str4[j][k + 2])
                {
                    a = i;
                    b = k;
                    while (str3[a][b] != '\0')
                    {
                        output = (char **)malloc(SIZE*sizeof(char));
                        output[m][n] = str3[a][b];
                        n++;
                        b++;
                    }
                    output[m][n] = '\0';
                    m++;
                }
            }
        }
    }
    return output;
    }

我在 visual studio 中调试这段代码,测试失败。它显示“消息:异常代码:C0000005”。这意味着与内存空间分配相关的错误。那么我哪里错了?

最佳答案

你有声明

output = (char **)malloc(SIZE*sizeof(char));

在你程序的两行。

您必须修改此语句才能为双指针分配内存 output类型 char** , 但您还需要为 output 的每个元素分配内存像这样:

int i;
output = (char **)malloc(SIZE*sizeof(char*));
for (i = 0; i < SIZE; i++)
    output[i] = (char *)malloc(x*sizeof(char));

哪里x是所需的大小。

还检查 NULL 指针返回,例如

if (output[i] == NULL)
    ....

关于c - 给定两个字符串,找到两个字符串共有的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36124508/

相关文章:

c - 是否可以使用 GCC 编译器在 Linux 中发出 BEEP 声音?

c - 调试阶乘递归

java - 在函数原型(prototype)中它显示错误

c - 分割字符串而不影响源

C 仅通过指针操作删除字符串中的前导和尾随空格

C 客户端-代理-服务器文件传输仅发送文件的一部分

c - bss 中的 28 个额外字节

c# - 将字符串属性作为键添加到字典中会克隆字符串吗?有适当的解决方法吗?

java - 字符串替换方法不替换字符

c - 从字符串中删除第一个和最后一个字符