如何在没有sprintf或strcpy的情况下将字符串分配给char数组
有没有一种方法可以不使用如何在没有sprintf或strcpy的情况下将字符串分配给char数组,c,arrays,string,pointers,char,C,Arrays,String,Pointers,Char,有没有一种方法可以不使用sprintf或strcpy?您可以这样做 char array[12]; sprintf(array, "%s %s", "Hello", "World"); printf(array); // prints "Hello World" 尽管我不能理解你的真正意思,但从你的标题,我理解你问如何给字符串赋值。因此,我将编写它的代码。我希望有帮助 char array[] = "Hello World"; 也可以指定多个值,如: char array[] = "Hell
sprintf
或strcpy
?您可以这样做
char array[12];
sprintf(array, "%s %s", "Hello", "World");
printf(array); // prints "Hello World"
尽管我不能理解你的真正意思,但从你的标题,我理解你问如何给字符串赋值。因此,我将编写它的代码。我希望有帮助
char array[] = "Hello World";
也可以指定多个值,如:
char array[] = "Hello World!";
可以一直走到最后一点。
但是它们是静态的,您将无法使用strcpy复制它们。如果需要,必须使用malloc,这是字符串数组的内存分配。不能直接将字符串分配给数组,但可以从字符串文本初始化数组:
char array[12];
array[0]="H";
array[1]="e";
如果以后要将不同的字符串存储到数组
,则必须使用以下字符串复制功能:
char array[] = "Hello World"; // this defines array with a size of 12 bytes
或者,您可以一次分配一个字符:
strcpy(array, "Hello Buddy"); // assuming array has at least 12 bytes
memcpy(array, "Hello Buddy", 12); // assuming array has at least 12 bytes
snprintf(array, sizeof array, "%s %s", "Hello", "Buddy");
请注意,最好使用snprintf
而不是sprintf
,以避免潜在的缓冲区溢出。还要避免将变量数组传递给printf
,如果它包含%
字符,则会导致未定义的行为。始终使用常量格式字符串:
array[6] = 'B';
array[7] = 'u';
array[8] = 'd';
array[9] = 'd';
array[10] = 'y';
array[11] = '\0';
给定两个字符串和一个足以容纳这两个字符串的缓冲区,可以使用循环复制内容:
printf("%s\n", array);
const char*s1=“你好”;
const char*s2=“世界”;
chars[12];
int i;
对于(i=0;i<5;i++){
s[i]=s1[i];
}
s[i++]='';
对于(i=0;i<5;i++){
s[i+6]=s2[i];
}
s[i+6]='\0';
如果是类似于命令行参数的情况,其中有一个带有计数的指针数组,则可以使用一对嵌套循环:
const char *s1 = "Hello";
const char *s2 = "World";
char s[12];
int i;
for(i = 0; i < 5; i++) {
s[i] = s1[i];
}
s[i++] = ' ';
for(i = 0; i < 5; i++) {
s[i + 6] = s2[i];
}
s[i + 6] = '\0';
char*argv[]={
“你好”,
“世界”,
无效的
};
int argc=2;
chars[12];
int i,j,k;
j=0;
对于(k=0;k
将字符串分配给数组的方法:
char *argv[] = {
"Hello",
"World",
NULL
};
int argc = 2;
char s[12];
int i, j, k;
j = 0;
for(k = 0; k < argc; k++) {
for(i = 0; argv[k][i]; i++) {
s[j++] = argv[k][i];
}
s[j++] = ' ';
}
if(k) {
s[--j] = '\0';
} else {
s[0] = '\0';
}
数组[0]='H';数组[1]=“e”;/*…*/数组[11]=0代码>strcpy有什么问题?循环或多或少是sprintf在引擎盖下所做的。printf(数组)代码>是不好的做法,顺便说一句。如果array
中有个百分号怎么办?使用fput(数组、标准输出)代码>或printf(“%s”,数组)代码>而是将字符串打印到标准输出。循环如何?因此,基本上,没有strcpy和snprintf是不可能的,因为分配每个char值不是一种方便的方法。谢谢回复!您正在为数组的元素0和1分配字符串指针。嗯,有点,因为它们很可能不适合它们。这不是任务,这是一个问题initialization@chqrlie. 谢谢你的接球。我相信我已经修好了。我很感激在我无法做到的时候进行调试。这只是一种复杂且完全不安全的避免strcpy的方法,所以它是毫无意义的。如果您在使用memcpy的过程中稍作更改,那么就可以避免使用memset。@Jabberwocky,OP会询问如何在不使用strcpy()的情况下使用它,这正是我提供的答案,因此这个答案正好回答了OPs的问题。因此,这并非毫无意义。我从来没有说过这是一种“安全”的方法,我们不应该在这里给出糟糕的建议。@Jabberwocky,我可以通过以下方式声明数组:char array[MAX_LEN]={\0'}但是为了灵活性/可重用性,我决定不这么做。我的意思是不使用strcpy是一个糟糕的选择。他的问题是,我想添加两个数字,但我不想使用+
运算符。我可以做到,但为什么?
#define MAX_LEN 12
int main( void )
{
...
char array[ MAX_LEN ];
...
memset( array, '\0', MAX_LEN );
memcpy( array, "hello world", strlen( "hello world" ) );