char sentence2[10];

    strncpy(sentence2, second, sizeof(sentence2));  //shouldn't I specify the sizeof(source) instead of sizeof(destination)?

    sentence2[10] = '\0';                       //Is this okay since strncpy does not provide the null character.

    puts(sentence2);
//////////////////////////////////////////////////////////////

    char *pointer = first;
    for(int i =0; i < 500; i++)                 //Why does it crashes without this meaningless loop?!
    {
        printf("%c", *pointer);
        if(*pointer == '\n')
            putchar('\n');
        pointer++;
    }


这就是问题所在。当我运行这段代码的第一部分时,程序崩溃。
但是,当我添加仅在内存位置打印垃圾值的for循环时,它不会崩溃,但仍然无法正确显示。

其次,在使用strncpy时,由于要移动源字节,我是否应该指定sizeof(source)而不是sizeof(destination)?

第三,对我来说,在strncpy之后添加null终止符对我来说是有意义的,因为我已经读到它不会自己添加null符,但是我得到警告,它可能是我的存储区拼写c IDE。

第四,也是最重要的是,为什么简单的strcpy无法工作?!?!

///////////////////////////////////////////////////// //////////////////////////////////

更新:

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

void main3(void)
{
    puts("\n\n-----main3 reporting for duty!------\n");
    char *first = "Metal Gear";
    char *second = "Suikoden";
    printf("strcmp(first, first)  = %d\n", strcmp(first, first));   //returns 0 when both strings are identical.
    printf("strcmp(first, second) = %d\n", strcmp(first, second));  //returns a negative when the first differenet char is less in first string.  (M=77  S=83)
    printf("strcmp(second, first) = %d\n", strcmp(second, first));  //returns a positive when the first different char is greater in first string.(M=77  S=83)

    char sentence1[10];
    strcpy(sentence1, first);
    puts(sentence1);
    char sentence2[10];
    strncpy(sentence2, second, 10); //shouldn't I specify the sizeof(source) instead of sizeof(destination).
    sentence2[9] = '\0';                        //Is this okay since strncpy does not provide the null character.

    puts(sentence2);
    char *pointer = first;
    for(int i =0; i < 500; i++)                 //Why does it crashes without this nonsensical loop?!
    {
        printf("%c", *pointer);
        if(*pointer == '\n')
            putchar('\n');
        pointer++;
    }
}


这就是我自学编程的方式。我编写代码并注释所有我了解的内容,以便
下次我需要查找某些内容时,只需在文件中查看自己的代码即可。在这一本书中,我试图学习c中的字符串库。

最佳答案

char *first = "Metal Gear";
char sentence1[10];
strcpy(sentence1, first);


这是行不通的,因为first有11个字符:字符串中的10个字符,再加上空终止符。因此,您将需要char sentence1[11];或更多。

strncpy(sentence2, second, sizeof(sentence2));



//我不应该指定sizeof(source)而不是sizeof(destination)吗?


否。strncpy的第三个参数应该是目标的大小。 strncpy函数将始终精确地写入那么多字节。

如果要使用strncpy,则还必须放置一个空终止符(并且必须有足够的空间用于该终止符),除非您确定strlen(second) < sizeof sentence2

一般来说,strncpy几乎从来不是一个好主意。如果要将空终止的字符串放入可能太小的缓冲区中,请使用snprintf


这就是我自学编程的方式。


反复尝试学习C不好。问题是,如果您编写错误的代码,您可能永远不会知道。它似乎可以正常运行,然后稍后失败。例如,sentence1是否会踩到任何其他变量的脚趾取决于strcpy之后在内存中的内容。

从书本上学习是最好的主意。如果您没有其他条件,K&R 2是一个不错的起点。

如果您没有书,请务必在网上查找标准功能的文档。您可以通过阅读strcpystrncpy的手册页或C标准草案中的定义等知识,来学习所有这些内容。

关于c - 为什么strcpy不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23418972/

10-11 21:18