C++ 使用指向字符的指针并编写用于分隔文本单词的函数
我想写一个函数,将一个指向char的指针和一个int(扫描开始索引)作为输入,并返回它后面的第一个单词。这个代码有什么问题?没有回音。 将创建从何处包括一个分隔符的问题。涂写字符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 *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构建成一个自动数组,并返回指向它的指针(当前代码所做的),那么当函数返回时只留下一个悬空的指针,数组就会被破坏 有两种可能的方法,每种方法都有其优缺点:
free
如果使用malloc
,delete[]
如果使用new[]
static char word[20];
静态数组将持续到程序结束,因此您可以在调用者中安全地使用它,而无需清理。但是在多线程程序中,静态数组将在所有线程之间共享,因此必须确保只有一个线程同时使用它,并且在您想要使用它时,另一个线程没有更改它。长话短说:如果该函数预期用于多线程程序,则不要使用该函数您希望从函数返回一个C字符串([指向]以null结尾的字符数组的指针)。问题是数组不是C中的第一类对象,所以只能传递和返回指针。任何自动数组都将在声明它的块的末尾达到其生命周期的终点。因此,如果您很好地将word构建成一个自动数组,并返回指向它的指针(当前代码所做的),那么当函数返回时只留下一个悬空的指针,数组就会被破坏 有两种可能的方法,每种方法都有其优缺点:
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];