说我有一个数组
char messages[10][2][50];
strcpy的正确语法是什么,为了将数据放入其中一个字符串(大多数为50的内部字符数组),然后是相应的约定,通过%s将它提供给printf?
就此而言,我是否以正确的顺序声明了数组下标?它是10批,成对(2)字符串。每个字符串宽50个字符。
01{{50 chars},{50 chars}}
02{{50 chars},{50 chars}}
...
09{{50 chars},{50 chars}}
10{{50 chars},{50 chars}}
各种互联网资源似乎与哪些下标省略冲突,无论我尝试什么似乎都会产生意想不到的结果。
e.g。你能填补下面的空白吗
strcpy(message???, "Message 1 Part 1");
strcpy(message???, "m1 p2");
strcpy(message???, "m2 p1");
strcpy(message???, "m2 p2");
strcpy(message???, "m3 p1");
strcpy(message???, "m3 p1");
//So on...
int i;
for(i=0;i<10;i++)
printf("%s, %s\n", message???, message???);
这样阵列具有并保持的结构:
01{{"Message 1 Part 1\0"},{"m1 p2\0"}}
02{{"m2 p1\0"},{"m2 p2\0"}}
01{{"m3 p1\0"},{"m3 p2\0"}}
//So on...
并且输出
消息1第1部分,m2 p2
m2,p2
m3,p3
等等
答案 0 :(得分:1)
我刚刚编写了一个快速程序来展示你所询问的事情......在声明中加载它们,strncpy到其中一个,然后将它们打印出来。
希望有所帮助
编辑:我有点讨厌魔术数字,所以我几乎完全删除了它们 编辑:我添加了替代品Tommi Kyntola和我在评论中谈到的
#include <stdio.h>
#include <string.h>
// safe string copy macro, terminates string at end if necessary
// note: could probably just set the last char to \0 in all cases
// safely if intending to just cut off the end of the string like this
#define sstrcpy(buf, src, size) strncpy(buf, src, size); if(strlen(src) >= size) buf[size-1] = '\0';
#define MSGLIMIT 10
#define MSGLENGTH 30
#define MSGFIELDS 2
#define MSGNAME 0
#define MSGTEXT 1
int main(void) {
char messages[MSGLIMIT][MSGFIELDS][MSGLENGTH] = { {"bla", "raa"},
{"foo", "bar"}
};
int i;
char *name1 = "name16789012345678901234567890";
char *text1 = "text16789012345678901234567890";
char *name2 = "name26789012345678901234567890";
char *text2 = "text26789012345678901234567890";
char *name3 = "name36789012345678901234567890";
char *text3 = "text36789012345678901234567890";
// doesn't set last char to \0 because str overruns buffer
// undocumented result of running this, but likely to just get the name2 string
// as that'll be the very next thing in memory on most systems
strncpy(messages[2][MSGNAME], name1, MSGLENGTH); // 2 because it's the next empty one
strncpy(messages[2][MSGTEXT], text1, MSGLENGTH);
// alternative suggested by Tommi Kyntola
// printf family are more complicated and so cost more cpu time than strncpy
// but it's quick and easy anywhere you have string.h and fine most of the time
snprintf(messages[3][MSGNAME], MSGLENGTH, "%s", name2);
snprintf(messages[3][MSGTEXT], MSGLENGTH, "%s", text2);
// uses the define macro at the top of the page to set the last char to \0 if
// otherwise not set by strncpy, adds a little weight but still the better option
// if performance of this section of code is important
sstrcpy(messages[4][MSGNAME], name3, MSGLENGTH);
sstrcpy(messages[4][MSGTEXT], text3, MSGLENGTH);
for(i = 0; i < 5; i++) // 5 because that's how many I've populated
printf("%s : %s\n", messages[i][MSGNAME], messages[i][MSGTEXT]);
return 0;
}
答案 1 :(得分:0)
你可以省略最大的订阅(在你的例子中它是10),因为它可以由编译器根据剩余的订阅来计算。 要传递50个元素的图层,请使用指针:(* messages)[10] [2] - 将指针放在50个元素的图层上
答案 2 :(得分:0)
我会用:
假设您要复制到char* new_buff
memcpy(new_buff, messages, 10*2*50);
你可以做3个嵌套循环并使用strncpy
。
不要使用strcpy ...它是不安全的
答案 3 :(得分:0)
正如已经指出的,最好使用strncpy,或者如下例所示,使用断言,以防止可能的缓冲区溢出。 strcpy与strncpy的性能略有提升。
#define FIRST_OF_PAIR 0
#define SECOND_OF_PAIR 1
int message_num = 7;
char messages[10][2][50];
char *string = "hello";
assert(strlen(string) < 50);
assert(message_num > 0 && message_num < 10);
strcpy(messages[message_num][SECOND_OF_PAIR], "Hello");
printf("%s", messages[message_num][SECOND_OF_PAIR]);
答案 4 :(得分:0)
将是
strcpy(message[0][0], "Message 1 Part 1");
strcpy(message[0][1], "m1 p2");
strcpy(message[2][0], "m2 p1");
strcpy(message[2][1], "m2 p2");
strcpy(message[3][0], "m3 p1");
strcpy(message[3][1], "m3 p2");
for(i=0;i<10;i++)
printf("%s, %s\n", message[i][0], message[i][1]);
尝试获得这个概念。