我试图了解strcpy和strncpy的区别/缺点.有人可以帮忙:
void main()
{
char src[] = "this is a long string";
char dest[5];
strcpy(dest,src) ;
printf("%s \n", dest);
printf("%s \n", src);
}
Run Code Online (Sandbox Code Playgroud)
输出是:
this is a long string
a long string
Run Code Online (Sandbox Code Playgroud)
问题:我不明白,源sting是如何被修改的.根据解释,strcpy应该继续复制,直到它遇到'\ 0',所以它确实如此,但为什么"src"字符串被修改.
请解释.
我是初学者,我正在学习如何在C中复制字符串.
这是我刚遇到的一个问题:
每次我尝试使用"strcpy"命令从字符串1复制到字符串2时,Visual Studio 2013会给我一条错误/警告消息,说"strcpy"不安全,建议我改用strcpy_s.
你能解释一下为什么使用strcpy不安全吗?什么是strcpy的更安全的替代品?
这是我的代码:
#include<stdio.h>
#include<string.h>
main()
{
char str1[] = "Copy a string.";
char str2[15];
char str3[15];
int i;
/* with strcpy() */
strcpy(str2, str1);
/* Without strcpy() */
for (i = 0; str1[i]; i++)
str3[i] = str1[i];
str3[i] = '\0';
/* Display str2 and str3 */
printf("The content of str2: %s\n", str2);
printf("The content of str3: %s\n", str3);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
PS我在Windows 7 64位终极版上使用Visual Studio 2013 64位终极版.感谢您的时间!
#include <cstring>
int main()
{
char *pName = new char[10];
char dummy[] = "dummy";
strcpy(pName + 0,dummy);//how this is different from -->this works
strcpy(pName[0],dummy);//this one...--> error C2664: 'strcpy' :
//cannot convert parameter 1
//from 'char' to 'char *'
}
Run Code Online (Sandbox Code Playgroud) char copy, array[20]
printf("enter ..."):
scanf("%s", array);
if (strlen(array) > 20 )
{
strcpy(copy, array....);
Run Code Online (Sandbox Code Playgroud)
如果输入超过20个字符,我需要做什么才能使它只抓取前20个字符
我正在使用 Xcode 4 制作一个命令行工具。
我在 strcpy 线上收到 EXC_BAD_ACCESS 错误:
char *invalidOption = NULL;
strcpy(invalidOption, argv[2]);
Run Code Online (Sandbox Code Playgroud)
argv[1] 是 -v (“有效”选项),argv[2] 是 -z (“无效”选项)。
然后,出于显示原因,我需要更改“invalidOption”(打印“错误”消息)。
关于为什么会发生这种情况有什么想法吗?如果您需要更多详细信息,请告诉我。
program-entry-point exc-bad-access objective-c strcpy xcode4
我想知道是否有不调用任何syscall()的libc函数?例如,对于libc函数“ strcpy()”,是否需要任何syscall调用(让我们考虑所有可能的linux系统)。
昨天我在自制的"strcpy"功能上遇到了一些麻烦.虽然现在有效,但我有点困惑!
char* a = "Hello, World!"; //Works
char b[] = "Hello, World!"; //Works also
strcpy(a, "Hello!"); //Segmentation fault
strcpy(b, "Haha!!"); //Works..
Run Code Online (Sandbox Code Playgroud)
区别在哪里?为什么char指针会导致"分段错误"?
为什么这甚至有效?:
char* a = "Haha"; //works
a = "LOL"; //works..
Run Code Online (Sandbox Code Playgroud) 假设我有一些遗留代码是使用对C STL函数的不安全调用编写的strcpy.我们都知道这strcpy是不安全的,因为它使程序容易受到缓冲区溢出问题的影响.假设我要将所有调用替换为strcpy调用strncpy.一种用于替换所有技术调用strcpy(dest, src)将涉及调用strncpy与参数(dest, src, length of dest - 1),然后终止dest与\0.我知道这个问题是我们并不总是知道它的长度,dest因为它可能是指向堆上分配的内存的指针.
我们假设我可以计算出dest每个呼叫站点的长度.我可以取代所有调用strcpy与调用strncpy,这将保证我的计划是不受缓冲区溢出攻击(至少从使用不当的strcpy).但是,这种方法可能会以不合需要的方式默默地截断数据并改变程序行为.这比检测截断和中止程序更好吗?或者是允许截断还是记录它更好吗?
我是从有兴趣开发修补遗留代码的自动方法的人的角度问的.有没有人对如何最好地解决这个问题有任何想法?
我将从我目前的代码开始,其中输入是用户提供的变量:
int current[2] = {-1, -1}, next[2] = {-1, -1};
char *strtok_result = strtok(input, " ");
int i = 0;
while(strtok_result != NULL){
i++;
int count = 0;
char strtok_buffer[2];
printf("iteration %d-%d: next[0] = %d\n", i, ++count, next[0]);
strcpy(strtok_buffer, strtok_result);
printf("iteration %d-%d: next[0] = %d\n", i, ++count, next[0]);
current[0] = next[0];
current[1] = next[1];
next[0] = strtok_buffer[1] - 48; // ascii conversion, digit to column
next[1] = toupper(strtok_buffer[0]) - 64; // --- || ---, letter to row
printf("iteration …Run Code Online (Sandbox Code Playgroud) 我有一个strcpy到处都在使用的大型项目。我正在考虑使用strcpy_s而不是strcpy. 我想我已经使用了近 10,000 次strcpy。每次都换好麻烦strcpy。有什么有效的转换方法吗?