2012-10-18 47 views
0

因为我对C编程非常陌生,所以我可能有一个非常简单的问题。C:创建字符串中存在的字符和字符

我有一个结构看起来像这样

typedef struct Vector{ 
    int a; 
    int b; 
    int c; 
}Vector; 

现在我想写向量的文件的数组。为了实现这一目标,我想创建这样的方法方案

String createVectorString(Vector vec){ 
    // (1) 
} 

String createVectorArrayString(Vector arr[]){ 
    int i; 
    String arrayString; 
    for(i=0; i<sizeof(arr); i++){ 
     //append createVectorString(arr[i]) to arrayString (2) 
    } 
} 

void writeInFile(Vector arr[]){ 
    FILE *file; 
    file = fopen("sorted_vectors.txt", "a+"); 
    fprintf(file, "%s", createVectorArrayString(arr); 
    fclose(file); 
} 

int main(void){ 

    // create here my array of Vectors (this has already been made and is not part of the question) 
    // then call writeInFile 

    return 0; 
} 

我的主要问题是在(1),其中涉及还(2)(因为我不知道如何用绳子在C工作,日食说“类型”字符串“未知”,虽然我包括<string.h>

所以我在某些时候读到的一点是,可以用itoa()方法将int转换为字符串。 正如我的理解是,我可以简单地做以下

char buf[33]; 
int a = 5; 
itoa(a, buf, 10) 

但是,我不能把那个工作,更何况,我无法弄清楚如何“粘贴” char S或int s转换为字符串。

在我的观点(1),我想创建表单(a,b,c),其中为a,b和c是我的结构向量的“场”的字符串。

在点(2),我想创建表单(a1,b1,c1)\n(a2,b2,c2)\n...(an,bn,cn),其中n是向量的阵列中的量的一个字符串。

是否有快速解决方案?我是否将Java的Strings概念与C的概念混为一谈?

+0

如果您包含''(小写's'),它提供了一些用于处理C字符串的函数,它们是以0结尾的char字符串。在标准C中没有'String'(或'string')类型。如果'String.h'是你的项目中定义'String'类型的头文件,那么我们需要了解这个错误。 –

+3

你误会了sizeof。 'sizeof arr'不会达到你所期望的。 – wildplasser

+0

这是一个错字,纠正了问题 –

回答

4

是的,你这样做混淆Java和C.

字符串的C字符串是相当不方便与之合作的概念。它们需要动态内存分配,更糟糕的是,相应的释放(这可能很乏味)。在你的情况下,最好是完全删除字符串,并且在没有字符串的情况下实现你需要的任何东西。

直接写入一个矢量到文件:

要写入向量的阵列,只是做上述在一个循环。

1

简而言之:是的,您将Java字符串与C混淆,您没有标准字符串类型。什么是字符串实际上是一个字符序列,字符值为0(或'\ 0',如果你想纯化)。

最快的解决方案是不生成字符串(并手动分配所有内存),而是使用fprintfFILE*。除了创建字符串的函数之外,还可以编写函数将各种信息写入FILE*,例如int writeVector(FILE* output, Vector v)。开始时会更容易。我认为构建这样的字符串所需的所有手动内存管理的所有细节都是不错的开始。 (注意在提出的原型中int的返回类型;这是针对错误代码的。)

此外,正如其中一位评论者指出的,您误解了sizeof。 sizeof(arr)会返回数组中所有元素的大小,以字节为单位(好吧,从技术上讲是字符,但这是一个你现在不需要担心的区别)。要获取数组中的元素数,您需要使用sizeof(arr)/sizeof(arr[0])。但我不确定它是否适用于你的函数参数,这在技术上是一个指针,尽管花哨的语法。将sizeof应用于指针将返回指针本身的大小,而不是它指向的数据。

这就是为什么用C你通常会在一个额外的函数参数提供了数组的大小,如:

String createVectorArrayString(Vector arr[], size_t n)

或更符合我上面写道:

int writeVectorArray(FILE *output, Vector arr[], size_t n) 
{ 
    int retcode = 0; 
    size_t i; 
    for (i = 0; i < n; ++i) { 
    if ((retcode = writeVector(output, arr[i])) != 0) 
     return retcode; 
    } 
} 
1

是的,你混淆Java字符串与C.

  1. 你不能在C中传递数组,只有指向第一个元素的指针。
  2. sizeof (arr)其中arr是一个函数参数,是指针的大小。
  3. 你不能返回一个块范围字符串,只有一个指向字符串的指针。但是当函数返回时,指向本地自动变量的指针超出了范围。

我写一个循环沿着

#define N 42 

/* Typedef for Vector assumed somewhere.*/ 
Vector arr[N]; 
/* Fill arr[]. */ 

for (i = 0; i < N; ++i) { 
    fprintf (file, "arr[%d] = { a=%d, b=%d, c=%d }\n", i, arr[i].a, arr[i].b, arr[i].c); 
} 
2

的字符串更多,在C,只是字符的空终止阵列。它通常声明为char *,但如果您有一个固定的最大长度,并且可以将其分配到堆栈或在结构中内联,则可能会声明为char str[LENGTH]

从字符和数字组合中构建字符串的最简单方法之一是使用snprintf()。这与printf()类似,但不是打印到标准输出,而是打印成一个字符串(数组为char)。请注意,您需要自行分配并传入缓冲区;因此您需要事先知道最大长度,或者通过尝试呼叫snprintf(),找出要打印的字符数,分配该大小的数组并再次调用snprintf()以实际打印结果。

所以,如果你有三个整数的向量,并希望建立一个串出来的,你可以写:

char *createVectorString(Vector vec){ 
    int count = snprintf(NULL, 0, "(%d,%d,%d)", vec.a, vec.b, vec.c); 
    if (count < 0) 
     return NULL; 
    char *result = malloc(count * sizeof(char)); 
    if (result == NULL) 
     return NULL; 
    count = snprintf(result, count, "(%d,%d,%d)", vec.a, vec.b, vec.c); 
    if (count < 0) 
     return NULL; 
    return result; 
} 

需要注意的是,因为你叫malloc()分配该缓冲区,您需要一旦你完成它,请拨打free(),以避免内存泄漏。

请注意,snprintf()只返回您需要从C99开始的长度。一些编译器(如MSVC)不支持C99,所以它们返回-1而不是字符串的长度。在这些情况下,可能会有另一个函数可以调用以确定需要的缓冲区的大小(在MSVC中,它的格式为_vscprintf),或者您可能需要猜测大小,如果不起作用,则分配一个缓冲两倍的大小,然后再试一次,直到成功。

相关问题