在这个函数中,我将接收char *单词,例如
person.vet.blah
和
word.friends.joe
我想提取第一个单词。所以对于我要提取的第一个
person
和我要提取的第二个
word
我怎样才能正确地做到这一点?这是我的代码:
char *separate_name(char *machine_name)
{
//iterate until you find period. then return
char absolute_name[1000];
int i;
for (i =0; i < strlen(machine_name); i++)
{
if (machine_name[i] == '.')
absolute_name[i] = machine_name[i];
}
return absolute_name;
}
这只是segfaulting。有什么想法我应该做什么? machine_name将成为“person.vet.blah”,然后返回absolute_name,这将是“person”
答案 0 :(得分:6)
正如其他人所指出的那样,你不能在定义它的函数之外使用absolute_name
。这是因为当您从函数返回变量时,返回的所有内容都是指向数组开头的指针。在函数外部,数组本身不再存在,因此指针无效,如果您尝试取消引用它,则会出现段错误。
您可以使用malloc
解决此问题。在完成使用后,不要忘记free
已分配的记忆。
顺便说一句,除了将循环更改为while
之外,我还修复了支票(您正在检查machine_name[i] == '.'
,与您想要的相反)。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *separate_name(char *machine_name)
{
// allocate memory on the heap
char *absolute_name = malloc(strlen(machine_name)+1);
int i = 0;
while (i < strlen(machine_name) && machine_name[i] != '.') {
absolute_name[i] = machine_name[i];
++i;
}
absolute_name[i] = '\0';
return absolute_name;
}
int main()
{
char name1[] = "person.vet.blah";
char *first1 = separate_name(name1);
if (first1 != NULL) {
printf("%s\n", first1);
free(first1);
}
char name2[] = "word.friends.joe";
char *first2 = separate_name(name2);
if (first2 != NULL) {
printf("%s\n", first2);
free(first2);
}
return 0;
}
strtok
是完成工作的完美工具:
#include <stdio.h>
#include <string.h>
char *separate_name(char *machine_name)
{
return strtok(machine_name, ".");
}
int main()
{
char name1[] = "person.vet.blah";
char *first1 = separate_name(name1);
if (first1 != NULL) printf("%s\n", first1);
char name2[] = "word.friends.joe";
char *first2 = separate_name(name2);
if (first2 != NULL) printf("%s\n", first2);
return 0;
}
正如评论中所指出的那样(感谢@John),strtok
修改传递给它的字符串(它用.
空字节替换分隔符\0
以标记字符串的结尾)。这不是一个问题,但需要注意。
使用任一程序输出:
person
word
答案 1 :(得分:1)
#include <stdio.h>
char *separate_name(const char *machine_name){
static char absolute_name[1000];
int i;
for (i =0; i < sizeof(absolute_name)-1 ; i++){
if(machine_name[i] == '.' || machine_name[i] == '\0'){
absolute_name[i] = '\0';
break;
} else {
absolute_name[i] = machine_name[i];
}
}
return absolute_name;
}
int main(void){
printf("%s\n", separate_name("person.vet.blah"));
printf("%s\n", separate_name("word.friends.joe"));
return 0;
}