我必须将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;
}
答案 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_string
是PString *
类型的变量。您尝试访问的内容实际上是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;
}