如何使用struct转换C类型的Pascal样式字符串

时间:2014-12-22 11:58:21

标签: c function struct pascal

我必须将Pascal样式字符串定义为结构并定义C字符串,然后编写一个函数将C字符串"Mississippi"转换为Pascal样式字符串。 Pascal样式字符串的成员变量int包含字符数,char变量包含字符串,但最后没有'\0'

我的问题在于for-loop功能。如何将C字符串中的字符放入新定义的Pascal样式字符串中?

我不允许使用string.h头文件。

#include <stdio.h>
#include <stdlib.h>

typedef struct PascalString {
  int size;
  char *string;
} PString;

struct PascalString *newPascalString(char *stringC) {  
  int i;  
  PString *pascal_string = malloc(sizeof(struct PascalString));  
  pascal_string->size = 11;
  pascal_string->string = malloc(sizeof(char) * pascal_string->size);

  for(i = 0; i < pascal_string->size; i++) {
    pascal_string[i] = stringC[i];  // here is my problem
  }  
  return pascal_string;
}

int main()
{ 
  char *c_string = "Mississippi";
  newPascalString(c_string);  
  return 0;
}

3 个答案:

答案 0 :(得分:3)

为什么你有问题? 只需使用:

pascal_string->string[i]=...

您也可以这样做:

  pascal_string->size = strlen(stringC); 

而不是使用11.啊,如果你不能使用标准功能,那就写自己的 strlen这应该非常简单(只需循环直到遇到0并且平均时间增加字符串长度变量)。

注意:另请注意,通常在c中,您有空终止符的+1空格 因为那是指示C中字符串结尾的内容所以如果你想要的话 存储字符串&#34; hi&#34;在数组中,您通常会分配 长度为3的数组也保存空终止符。

答案 1 :(得分:1)

只需更改此

for(i = 0; i < pascal_string->size; i++)

for(i = 0; (i < 11) && (stringC[i] != 0) ; i++)

由于C字符串被'\0'终止,您必须循环,直到找到终止'\0'或者您没有空间。

你也可以像这样计算字符串的长度

for (i = 0 ; stringC[i] != '\0' ; ++i)
    pascal_string->size++;

然后按原样保持循环

for(i = 0; i < pascal_string->size; i++)

您的代码还有另一个问题,这就是问题

pascal_string[i] = stringC[i];

您应该将字符存储在string成员中,如下所示

pascal_string->string[i] = stringC[i];

显然你需要这个

#include <stdio.h>
#include <stdlib.h>

typedef struct PascalString {
    int size;
    char *string;
} PString;

PString *newPascalString(char *stringC) {
    int i;

    PString *pascal_string = malloc(sizeof(struct PascalString));
    if (pascal_string == NULL) /* always check the return value of malloc */
        return NULL;

    pascal_string->size = 0;
    for (i = 0; stringC[i] != '\0'; ++i)
        ++pascal_string->size;

    pascal_string->string = malloc(pascal_string->size);
    if (pascal_string->string == NULL) {
        free(pascal_string);
        return NULL;
    }

    for(i = 0; i < pascal_string->size; i++)
        pascal_string->string[i] = stringC[i];  // here is my problem

    return pascal_string;
}

int main()
{
    char *c_string = "Mississippi";
    PString *pascal_string;

    pascal_string = newPascalString(c_string);
    if (pascal_string != NULL) {
        if (pascal_string->size == 11)
            printf("the pascal string has length 11 excluding the terminating `'\\0'`.\n");
        else
            printf("the pascal string length is not 11.\n");
        if (pascal_string->string != NULL) {
            /* write to standard output exacly pascal_string->size characters */
            /* printf will not work here, it needs `'\0'` at the end */
            fwrite(pascal_string->string, 1, pascal_string->size, stdout);
            printf("\n");
            /* free pascal_string->string, allocated with 
             *
             *     pascal_string->string = malloc(pascal_string->size) 
             */
            free(pascal_string->string);
        }
        /* free pascal_string, allocated with
         *
         *     pascal_string = malloc(sizeof(struct PascalString)) 
         */
        free(pascal_string);
    }
    /* since pascal_string == NULL no need to call free */
    return 0;
}

答案 2 :(得分:1)

要创建pascal样式字符串,您需要对代码进行一些更改。

正如您所提到的,问题是

pascal_string[i] = stringC[i];

pascal_stringPString *类型的变量。您尝试访问的内容实际上是pascal_string->string[i]

注意:您可以确定提供的字符串的长度并相应地分配内存,而不是使用11的硬编码值。 [相当于strlen()]

pascal_string->string = malloc((my_strlen(stringC)+1));              //allocate one more byte than supplied string size
if (pascal_string->string){                           //check malloc success.
    for(i = 0; (stringC[i] != 0); i++) {    //continue upto end of input string
        pascal_string->string[i] = string[i];  
    }  
    pascal_string->string[i] = 0;                                //terminating null
}
return pascal_string;                                //return

my_strlen()的伪代码:

int my_strlen(char * ip)
{
    int i = 0;
    for (i = 0; ip[i] != '\0'; i++);
    return i;
}