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