c - 字符串复制例程在 C 中不起作用

标签 c string

我尝试使用下面的代码在 C 中复制字符串,但没有得到正确的结果。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void){
    char *string1;
    char *string2 = "abcdefghijk";
    char *ptr = string2;
    unsigned int no_of_chars =0;

    while(*ptr++ !='\0'){
        no_of_chars++;
    }

    string1 = malloc(sizeof(char)*(no_of_chars+1));
    while(*string1++ = *string2++);
    printf("string2=%s\n",string2);
    printf("string1=%s\n",string1);

    return 0;  
}

我使用 MinGW 编译器得到以下结果:

string2=string2=%s

string1=ï‼

编辑:好的,更改了代码,下面的代码可以工作。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void){
    char *string1;
    char *string2 = "abcdefghijk";
    char *ptr = string2, *ptrsrc = string2;
    unsigned int no_of_chars = 0;

    while(*ptr++ !='\0'){
        no_of_chars++;
    }

    char *ptrdst = string1 = malloc(sizeof(char)*(no_of_chars+1));

    while(*ptrdst++ = *ptrsrc++);

    printf("string2=%s\n",string2);
    printf("string1=%s\n",string1);

    return 0;   
}

最佳答案

运行 while(*string1++ = *string2++); 后,string1 指向第一个字符串的末尾,string2 指向第二个字符串的末尾。

也就是说,它们都指向各自空终止符之后的下一个字节,因此 printf 看到两个垃圾字符串(可能是空白)。

您可以使用不同的变量来保存字符串中的起始位置和当前位置,例如:

char *pstr1 = string1;
char *pstr2 = string2;
while(*pstr1++ = *pstr2++);

现在,pstr1pstr2 指向超出其字符串末尾的一个字符,但 string1string2仍然指向开始。

关于c - 字符串复制例程在 C 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41946788/

相关文章:

c - linux下如何定位导致应用程序收到SIGTTIN的代码位置?

javascript - 当达到字符限制时,如何在字符串中添加换行符而不破坏单词?

c++ - 在结构中初始化一个字符串对象

Javascript 将数组连接到字符串

string - 提取给定字符串之间的子字符串

c - 如何在 linux 终端上用 C 打印这段代码中的所有字符?

c++ - 有没有优化 x86 二进制代码的库?

c - C 中的右对齐零填充字符串

C:检查一组五张牌是否组成葫芦

Python字符串格式化太慢