c - 我的程序在某些情况下似乎无法分隔单词

标签 c string pointers char double-pointer

我最关心的是查找和分离功能。当我在另一个程序中重用它们时,我发现它们并不总是有效,有时会显示段错误。我尝试了所有能做的事情,但没有任何效果。

#include <stdio.h>
#include<stdlib.h>
#include <string.h>

int find(char *argument)
{
    int count = 0;
    int i = 0;
    int state = 0;
    while (argument[i] != '\0')
    {
        if (argument[i] == ' ' || argument[i + 1] == '\0')
        {
            state = 0;
        }
        else if (state == 0)
        {

            state = 1;
            count++;
        }
        i++;
    }
    return count;
}

char **sepration(int args, char str[])
{
    int i = 0;
    char **argv = (char **)malloc(args);

    int k = 0;
    int len = strlen(str);
    while (i < len)
    {

        if (str[i] != ' ')
        {
            char *st = &str[i];
            argv[k] = st;
            k++;
            while (str[i] != ' ' && str[i] != '\0' && i < len)
            {
                i++;
            }
            str[i] = '\0';
        }
        i++;
    }

    return argv;
}

int main()
{
    char argument[100];
    scanf("%[^\n]s", &argument);
    //finds the no of words in the given argument
    int args = find(argument);
    char **argv = (char **)malloc(args + 1);
    //stores the word separately in **char pointer array
    argv = sepration(args, argument);
    //adds the arguments whichs are numbers
    add(args, argv);
}

最佳答案

您的解决方案的问题在于您没有正确分配内存
您的双指针argv应该作为字符串数组工作。因此argv应该为其分配足够的内存。那么下一个问题是如何为其分配足够的内存。如argv应该持有 argc字符串的数量,因此正确的内存分配将是
char **argv = malloc(args * sizeof(char *));或者,
char *argv[argc];

修改后的代码将如下所示

char **sepration(int args, char str[])
{
    int i = 0;
    char **argv = malloc(args * sizeof(char *));

    int k = 0;
    int len = strlen(str);
    while (i < len)
    {
        if (str[i] != ' ')
        {
            char *st = &str[i];
            argv[k] = st;
            k++;
            while (str[i] != ' ' && str[i] != '\0' && i < len)
            {
                i++;
            }
            str[i] = '\0';
        }
        i++;
    }
    return argv;
}

int main()
{
    char argument[100];
    scanf("%[^\n]", argument);
    //finds the no of words in the given argument
    int args = find(argument);
    char **argv = malloc(args * sizeof(char *));
    //stores the word separately in **char pointer array
    argv = sepration(args, argument);
    for(int i = 0; i < args; i++)
        printf("%s\n", argv[i]);
}

而不是 char **argv = malloc(args * sizeof(char *));您可以使用char *argv[argc];以及。这也会产生相同的结果。

关于c - 我的程序在某些情况下似乎无法分隔单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52102699/

相关文章:

python - 在Python中比较一维和二维序列的有效方法

java - 为什么不在 StringUtils、Spring-Core 中使用 len 而不是 str.length() ?

c - 如何读取数组直到新行 '\n'?

c - 那会错吗?如果是这样,为什么呢?产量为2500

我可以在没有CAN HW接口(interface)的情况下使用socketCAN在Linux中实现环回吗?

c - 为什么变量声明的顺序很重要?

c - 如何在c中打印程序编译位置的路径

c - Beagle 骨 ADC 读取值

C++ 指针和动态内存

c++ - 为什么指针返回时不能自动转换为unique_ptr?