C编程:创建子串

时间:2017-12-12 12:26:18

标签: c

我是C的新手,我需要解释一下我做错了什么。

我正在尝试迭代字符串并找到第一个'\'然后从数组中的那个位置创建一个子字符串。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {

    struct info{
        char* name;
        char* type;
        char* path;
    };
    struct info user1;

    char* a = "/home/users/user1";

    for (int i = strlen(a) ; i < 0 ; i--) {
        printf("%d",i);
        if(strcmp(a[i],'/')==0){
            strncpy(a,user1.name,i);
            break;

        }


    }

    return 0;
}

2 个答案:

答案 0 :(得分:1)

我会逐一解释这些错误。代码将是这样的。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void) {

    struct info{
        char* name;
        char* type;
        char* path;
    };
    struct info user1;
    user1.name = malloc(40);
    if( user1.name == NULL){
        fprintf(stderr, "%s\n","Error in malloc" );
        exit(1);
    }

    const char* a = "/home/users/user1";

    for(int i = strlen(a) -1; i >= 0 ; i--) {
        if(a[i]=='/'){
            strncpy(user1.name,a+i+1,i);
            user1.name[i]='\0';
            break;
        }


    }
    printf("%s\n",user1.name );
    free(user1.name);
    return 0;
}

你做错了什么

  • 没有分配给name的内存,它只是一个未初始化的指针。这里我们已经为它分配了内存。

  • 第二件事,strcmp顾名思义比较了null终止的char数组而不是char - s。可以使用简单的==运算符来完成。

  • 复制部分被修改为仅复制用户名部分。这就是我们将指针递增到指向正确位置的原因。

  • 您忘记检查malloc的返回值,然后您应该释放已分配的内存。

  • 此外,您无法修改字符串文字,因为它保留在内存的不可修改部分。

答案 1 :(得分:0)

试试这个,

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {

    struct info{
        char* name;
        char* type;
        char* path;
    };
    struct info user1;
    user1.name = malloc(10); 
    char* a = "/home/users/user1";
     int len=strlen(a);

    for (int i = 0; i < len; i++) {
        printf("%d",i);
        if(a[i]=='/'){
            strncpy(user1.name,a+i+1,i);
        user1.name[i]='\0';
        break;

        }


    }

    return 0;
}