Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用指向字符的指针并编写用于分隔文本单词的函数_C++_Pointers_Char - Fatal编程技术网

C++ 使用指向字符的指针并编写用于分隔文本单词的函数

C++ 使用指向字符的指针并编写用于分隔文本单词的函数,c++,pointers,char,C++,Pointers,Char,我想写一个函数,将一个指向char的指针和一个int(扫描开始索引)作为输入,并返回它后面的第一个单词。这个代码有什么问题?没有回音。 将创建从何处包括一个分隔符的问题。涂写字符 char *setWord(char string[], int *n) { char word[20] = "\0"; string += *n; while (*string == ','||*string == '\t' || *string == '\n' || *string

我想写一个函数,将一个指向char的指针和一个int(扫描开始索引)作为输入,并返回它后面的第一个单词。这个代码有什么问题?没有回音。 将创建从何处包括一个分隔符的问题。涂写字符


char *setWord(char string[], int *n) {
    char word[20] = "\0";
    string += *n;
    while (*string == ','||*string == '\t' || *string == '\n'
    || *string == ' '|| *string == '.' || *string == '!' || *string == '?') {
        string++;
       (*n)++;
    }
    int i = 0;
    while (*string != ',' && *string != '\t'
                     && *string != '\n' && *string != ' ' &&
                     *string != '.' && *string != '!' &&
                     *string != '?') {
        word[i] = *string;
        string++;
        (*n)++;
        i++;
    }
    char *words = word;


    return words;
}

如注释中所述,由于返回了指向局部变量(
words
)的指针,因此没有UB。最初,循环中还有
n++
,而不是
(n*)++
,后者也是UB。您需要在代码中进行错误检查,但以下操作仍然有效,并且仍然坚持使用
char*
(无错误检查):


如注释中所述,由于返回了指向局部变量(
words
)的指针,因此没有UB。最初,循环中还有
n++
,而不是
(n*)++
,后者也是UB。您需要在代码中进行错误检查,但以下操作仍然有效,并且仍然坚持使用
char*
(无错误检查):


您希望从函数返回一个C字符串([指向]以null结尾的字符数组的指针)。问题是数组不是C中的第一类对象,所以只能传递和返回指针。任何自动数组都将在声明它的块的末尾达到其生命周期的终点。因此,如果您很好地将word构建成一个自动数组,并返回指向它的指针(当前代码所做的),那么当函数返回时只留下一个悬空的指针,数组就会被破坏

有两种可能的方法,每种方法都有其优缺点:

  • 使用分配的内存(@ChrisMM的答案)

    它可以是递归的和线程安全的。您只需记录调用者将负责释放内存块,以及如何释放内存块:
    free
    如果使用
    malloc
    delete[]
    如果使用
    new[]

  • 使用静态内存

    一个快速解决方法是写:

    static char word[20];
    
    静态数组将持续到程序结束,因此您可以在调用者中安全地使用它,而无需清理。但是在多线程程序中,静态数组将在所有线程之间共享,因此必须确保只有一个线程同时使用它,并且在您想要使用它时,另一个线程没有更改它。长话短说:如果该函数预期用于多线程程序,则不要使用该函数


  • 您希望从函数返回一个C字符串([指向]以null结尾的字符数组的指针)。问题是数组不是C中的第一类对象,所以只能传递和返回指针。任何自动数组都将在声明它的块的末尾达到其生命周期的终点。因此,如果您很好地将word构建成一个自动数组,并返回指向它的指针(当前代码所做的),那么当函数返回时只留下一个悬空的指针,数组就会被破坏

    有两种可能的方法,每种方法都有其优缺点:

  • 使用分配的内存(@ChrisMM的答案)

    它可以是递归的和线程安全的。您只需记录调用者将负责释放内存块,以及如何释放内存块:
    free
    如果使用
    malloc
    delete[]
    如果使用
    new[]

  • 使用静态内存

    一个快速解决方法是写:

    static char word[20];
    
    静态数组将持续到程序结束,因此您可以在调用者中安全地使用它,而无需清理。但是在多线程程序中,静态数组将在所有线程之间共享,因此必须确保只有一个线程同时使用它,并且在您想要使用它时,另一个线程没有更改它。长话短说:如果该函数预期用于多线程程序,则不要使用该函数


  • 请提供样本数据和预期结果。您有UB<代码>字符*单词=单词;返回单词word[20]是局部变量。另外,如果
    n>strlen(string)
    呢?或者如果
    字符串
    仅为
    ?这里有很多问题。另外,在第一个while循环中有
    n++
    ,但它应该是
    (*n)+
    ,因为我无法更改指向该字符的指针,我使用了数组,然后将其作为指针。还有什么其他解决方案可以做到这一点?@chrismplease提供示例数据和预期结果。您有UB<代码>字符*单词=单词;返回单词word[20]是局部变量。另外,如果
    n>strlen(string)
    呢?或者如果
    字符串
    仅为
    ?这里有很多问题。另外,在第一个while循环中有
    n++
    ,但它应该是
    (*n)+
    ,因为我无法更改指向该字符的指针,我使用了数组,然后将其作为指针。还有什么其他的解决办法@ChrisMM@SergeBallesta,我的错。我通常会先取出
    getchar()。。。和+1:-)@SergeBallesta,我的错。我通常会先取出
    getchar()。。。和+1:-)
    
    static char word[20];