【问题标题】:Printing strings from all array elements从所有数组元素打印字符串
【发布时间】:2014-04-18 11:24:00
【问题描述】:

我尝试将数组中的所有元素打印为字符串。

以下代码出现分段错误。

因为 char 的某些指针没有指向正确的地址。

char *print_array(char **s) {
        int i;
        char *ret;
        char *elm;
        char *myStr;
        strcat(myStr,"[");
        for (i = 0; s && s[i]; ++i){
                sprintf(elm,"\"%s\" ",s[i]);
                strcat(myStr,elm);
        }
        strcat(myStr,"]");
        ret = myStr;
        return ret;
} 
int main(){
        char *myArray[10] = {"4", "2", "11", "4", "15", "7", "9", "12", "3", "6"};;
        printf("## %s",print_array(myArray));
}

那么,如何打印数组中所有元素的字符串呢?

我的意思是上面的例子使用了 10 个数组元素,但我想打印任何不知道每个元素有多少元素和长度的数组。

有谁知道好方法吗?

【问题讨论】:

  • 您不会为数字所在的字符串分配任何内存。所以你不知道它指向哪里,你在内存中的某个地方写字符。您必须先malloc 一些空间。
  • 当我不知道数组的大小时,我必须 malloc 多少大小?
  • 看看约阿希姆的回答。您必须以一种或另一种方式传递大小。您可以自行分配足够的内存。

标签: c arrays string pointers char


【解决方案1】:

简短且唯一的答案是:您需要告诉打印函数数组中有多少项。

如何你做它并不重要,或者作为一个参数,或者你在数组中放入一个额外的项目作为终止符,例如NULL 指针(很像字符串本身由 '\0' 字符终止)。目前,您的打印功能很可能会超出您传入的数组的范围。


您的代码还有其他问题,例如您既没有为elm 也没有为myStr 分配内存。而ret 变量则毫无用处。

【讨论】:

  • 如果我可以打印malloc。打印动态创建的数组是不可能的吗?
  • @user1345414 使用malloc/realloc 动态分配,或者使用固定大小的数组。如果您使用固定大小的数组,我建议您改用snprintf
【解决方案2】:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *print_array(char **s) {
    int i, n;
    size_t size =0;
    char *ret;

    for(i=0; s && s[i]; ++i)
        size += strlen(s[i]);

    n = i;//number of strings,
    if(ret = malloc(size + 2 + (n-1)*(n>0) + n*2 + 1)){//sumoflen(s) + [] + ' ' + "" + '\0'
        int len;
        char *p = ret;

        *p++ = '[';
        for (i = 0; i < n; ++i){
            len = sprintf(p, "\"%s\"", s[i]);
            p += len;
            if(i < n-1)
                *p++ = ' ';
        }
        *p++ = ']';
        *p = '\0';
    }
    return ret;
}

int main(){
    char *myArray[] = {"4", "2", "11", "4", "15", "7", "9", "12", "3", "6", NULL};//last : Sentinel
    char *p;
    printf("## %s", p=print_array(myArray));
    free(p);
    return 0;
}

【讨论】:

  • *(n&gt;0) 是什么意思?我不知道这种语法。
  • @user1345414 True 是 1(false 是 0)C 中的逻辑表达式。我把夹在中间的空格的条件数设置为 n-1,但奇怪的是 n 在 0 时是 -1。跨度>
猜你喜欢
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
相关资源
最近更新 更多