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是一个不错的起点。
如果您没有书,请务必在网上查找标准功能的文档。您可以通过阅读
strcpy
和strncpy
的手册页或C标准草案中的定义等知识,来学习所有这些内容。关于c - 为什么strcpy不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23418972/