为什么我的程序没有将字符串a的内容复制到字符串b?而是打印一些垃圾值

时间:2019-07-08 01:18:09

标签: c string

任务是询问用户从哪个字符开始,直到他要在哪里创建另一个字符串。

int main()
{
    char a[]="Working with stirng is fun";
    printf("%s",a);
    int s,e,j=0; 
    scanf("%d%d",&s,&e);
    char b[e-s+2];
    for(int i=s-1;i<=e-1;i++){
        a[j]=b[i];
        j++;
    }
    a[j]='\0';
    printf("%s",b);
}

例如:如果用户输入4和7,则输出应为“ king”。

3 个答案:

答案 0 :(得分:2)

您似乎正在尝试将a的一部分复制到b,但实际上是将其分配给a的元素。

答案 1 :(得分:1)

您可以在循环中向后分配作业。您的a []变量是源字符串,b []是目标字符串,但是您的赋值是a[j]=b[i];,它将b [i]赋给a [j]。顺便说一下,这是一个很好的例子,说明为什么变量名(如a和b)不好。如果您使用过像big_string和sub_string这样的变量名,您将不会遇到此问题。同样,当您有多个字符串时,诸如i和j之类的名称也会令人困惑-big_index和sub_index或其中一些这样的名称会更加清晰。

从样式上讲,您最好使i和j更紧密地平行,而不是在for行上声明和递增i,并且完全不同地声明和递增j:

int i, j;
for (i = s - 1, j = 0 ; i <= e - 1 ; i++, j++)
    b[j] = a[i];
b[j] = '\0';

对我来说似乎更干净。

我认为更好的方法是使用单个变量来跟踪处理的字符数,并将其用作原始字符串的偏移量和子字符串的索引:

start--;   // adjust user's input to start at 0 instead of 1
end--;
int dex;
for (dex = 0 ; dex <= end - start ; dex++)
    sub_string[dex] = orig_string[start + dex];
sub_string[dex] = '\0';

(我还更改了更清晰的变量名,并将索引的更正从1更改为0而不是变量,而不是在循环内进行数学运算,这只会增加混乱)。

最后,最简单的方法是使用内置的strncpy()函数:

strncpy(sub_string, &orig_string[start], end - start + 1);

答案 2 :(得分:1)

只需更改线路     a[i] = b[j];b[j]=a[i];a[i] = '\0';b[j]='\0';