Pascalスタイルの文字列を構造体として定義し、C
文字列も定義してから、C文字列"Mississippi"
をPascalスタイルの文字列に変換する関数を作成する必要がありました。Pascalスタイルの文字列にはint
、文字数のあるメンバー変数と、末尾にchar
文字列のない変数があります'\0'
。
私の問題はforループ関数にあります。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;
}
これを変更するだけ
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;
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加