我正在尝试通过使用空格将字符串与字符串分开,但是不幸的是我在C中遇到了段错误错误。但是,当您使用空格传递字符串时,它工作得很好,例如“ Hello World”,但当我传递带有两个空格(即“ h e r”)的字符串时不起作用。
我不明白我哪里错了。
#include<stdio.h>
#include<string.h>
char* yoda(char n1[20])
{
int i,j,t=0,k=2,len,c=0;
len=strlen(n1);
char n2[20];
char* n3[20];
for(i=0;i<len;i++)
{
if(n1[i]==' ')
c++;
}
for(i=0;i<c+1;i++)
{
for(j=0;j<len;j++)
{
if(k==0)
{
if(n1[t+1]==' ')
{
t++;
break;
}
else
{
n2[j]=n1[t+1];
t++;
}
}
else if(n1[j]==' ')
{
t=j;
k=0;
break;
}
else
{
k=1;
n2[j]=n1[j];
}
}
strcpy(n3[i],n2);
}
for(i=0;i<c+1;i++)
{
//for(j=0;j<len;j++)
{
printf("\n%s",n3[i]);
}
}
}
void main()
{
int i,j,k;
char sen[20],res[20];
scanf("%[^\n]s",sen);
//printf("%s",
yoda(sen);
}
答案 0 :(得分:2)
由于未为char *n3[20];
分配内存,因此发生了分段错误。
在语句strcpy(n3[i],n2);
中,n3[i]
未分配给任何内存空间。您必须使用动态内存分配为n3[i]
动态分配内存。
也可以将您的条件i<c+1
替换为更简单的条件i<=c
;。您的代码中for-loops
太多,导致代码不可读。您还没有从char* yoda(char n1[20])
;返回任何值。您忘记了在\0
之前使用n2
来表示字符串结尾strcpy(n3[i],n2);
。
我有re-written
个for-loops
小写的代码。试试这个:-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *yoda(char *n1) // modified function.
{
int i, j, k, c = 0;
char n2[20];
char *n3[20];
for (j = 0, k = 0;; j++)
{
if (n1[j] != ' ' && n1[j] != '\0')
{
n2[k++] = n1[j];
}
else
{
n2[k] = '\0';
n3[c] = (char *)malloc(sizeof(n2)); // dynamic memory allocation
strcpy(n3[c], n2);
c++;
k = 0;
}
if (n1[j] == '\0')
{
break;
}
}
for (i = 0; i < c; i++)
{
{
printf("\n%s", n3[i]);
}
}
}
int main()
{
int i, j, k;
char sen[20], res[20];
scanf("%[^\n]s", sen);
//printf("%s",
yoda(sen);
return 0;
}
输出:-
I Love you C
I
Love
you
C