【问题标题】:copying portions of string, which are stored in a char array, to another array将存储在 char 数组中的部分字符串复制到另一个数组
【发布时间】:2013-08-10 05:40:09
【问题描述】:

我想尝试将已经存储在一个字符串数组中的部分字符串复制到另一个空数组。 (我认为称为指向 char 数组的指针数组)

我想复制每个字符串的前 3 个字符并将它们存储在第二个数组中,然后将它们打印出来 - 就像这样

AAA
BBB
CCC
DDD
EEE
FFF

这是我的代码。

void main()
{

/*ARRAY 1*/
char *line1 = "AAAAA";
char *line2 = "BBBBB";
char *line3 = "CCCCC";
char *line4 = "DDDDD";
char *line5 = "EEEEE";
char *line6 = "FFFFF";


char *array1[6];

array1[0] = line1;
array1[1] = line2;
array1[2] = line3;
array1[3] = line4;
array1[4] = line5;
array1[5] = line6;


int i;  

char *array_main[6];

for(i = 0; i<6 ; i++ ) {
    array_main[i] = ("%*.*s\n",1,3,array1[i]);
    printf("%s", array_main[i]);
    printf("\n");
    }
}

我需要在这里做一个 malloc 吗? (对于array_main [i])据我了解,我基本上只是将特定字符的地址复制到array_main 的元素中。

编辑 - 抱歉,我应该更清楚地说明这一点,我想收集 array_main 中的字符串,然后在实际复制数据的循环之外按顺序打印它们。

【问题讨论】:

  • array_main[i] = ("%*.*s\n",1,3,array1[i]); 这并不像您认为的那样 - 您需要查看使用 sprintf - 是的,您需要使用 malloc
  • 好的..我真的不想在分配字符串后立即打印数组...我应该更清楚地说明这一点,我想收集 array_main 中的字符串,然后按顺序打印它们实际复制数据的循环。

标签: c arrays string copy char


【解决方案1】:

您正在将指向静态声明字符串的指针复制到数组中。这理论上没问题。但是,您想切断剩余的字符串,因此您需要为目标字符串准备内存,因为如果您写入字符串,您将调用未定义的行为。

这一行:

array_main[i] = ("%*.*s\n",1,3,array1[i]);

绝对不会做你想做的事。我认为这甚至不应该编译。

您循环遍历数组和malloc 适当大小的字节 (3+1),然后复制您想要的字符串部分(不要忘记末尾的 0 字节)。

所以它应该是这样的:

for(i = 0; i < 6; i++)
{
    array_main[i] = malloc(4);
    snprintf(array_main[i], 4, "%.3s", array[i]);
    printf("%s\n", array_main[i]);
    free(array_main[i]);
}

一个更简单的版本(具有不必要的内存开销)是这样的:

for(i = 0; i < 6; i++)
{
    array_main[i] = strdup(array[i]);
    array_main[i][3] = 0;
    printf("%s\n", array_main[i]);
    free(array_main[i]);
}

【讨论】:

  • 无论如何我可以改变要复制的字符串段的大小吗?你也可以解释一下 snprintf(array_main[i], 4, "%.3s", array[i]); ,4 和 "%.3s" 到底是做什么的?
  • man snprintf 帮助... 4 是缓冲区的大小,“.3”将 ooutput 限制为 3 个字符。好吧,这里并不是绝对必要的,我只是采用了它,因为您正在使用这种模式。是的,您可以通过使用“*”而不是硬编码的“3”来改变大小。阅读手册页并尝试使用这样一个简单的程序并没有太多的 IMO。
【解决方案2】:
#include <stdio.h>
#include <string.h>

int main(void){
    const char *array1[6] = {"AAAAA", "BBBBB", "CCCCC", "DDDDD", "EEEEE", "FFFFF" };
    char array_main[6][4] = {{0}};//4 : 3 + 1 (+1 for End of string('\0'))
    int i;

    for(i = 0; i<6 ; i++ ) {
        strncpy(array_main[i], array1[i], 3);
        printf("%s\n", array_main[i]);
    }
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多