在C中找到更新字符串直到句点

时间:2014-09-09 21:35:16

标签: c

在这个函数中,我将接收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”

2 个答案:

答案 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;
}