|
割り込み失礼します。
配列版なんてのはしばらく書いた事がなかったのでゴチャゴチャしてい
ます。もしかしたらバグが残っているかも知れません。もっとスマート
に書きたいのですが・・・スペース文字の扱いを厳しくしていたらこんな
になってしまいました。逆にポインタ版の方はほとんどスペース文字の
チェックをしていませんので文字列の与え方によっては配列版と異なる
結果が出る場合があります。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 20
#define LEN 30
int apart_by_array(char str[][LEN], const char *s);
int apart_by_pointer(char *strp[], const char *s);
int main(void)
{
int n1, n2, i;
char str[N][LEN], *strp[N], *s = "This is not an apple";
/* 配列版 */
n1 = apart_by_array(str, s);
printf("配列版の分解\n");
for (i = 0; i < n1; i++)
printf("%3d: %s\n", i + 1, str[i]);
/* ポインタ版 */
n2 = apart_by_pointer(strp, s);
printf("ポインタ版の分解\n");
for (i = 0; i < n2; i++) {
printf("%3d: %s\n", i + 1, strp[i]);
free(strp[i]);
}
return 0;
}
/* 配列版の分解 */
int apart_by_array(char str[][LEN], const char *s)
{
int n, i, j;
if (strlen(s) == 0) return 0;
for (i = 0, n = 0; s[i]; i++)
if (s[i] != ' ') n++;
if (n == 0) return 0;
for (i = 0; s[i] == ' '; i++);
for (j = 0, n = 0; s[i]; i++) {
if (s[i] != ' ')
str[n][j++] = s[i];
else {
str[n][j] = '\0';
while (s[i] == ' ') i++;
if (s[i] == '\0' && s[i - 1] == ' ') break;
i--;
n++;
j = 0;
}
}
str[n][j] = '\0';
return n + 1;
}
int apart_by_pointer(char *strp[], const char *s)
{
int n = 0;
char *p, *ds;
ds = strdup(s);
if ((p = strtok(ds, " ")) == NULL) {
free(ds);
return 0;
}
strp[n++] = strdup(p);
while (p = strtok(NULL, " "))
strp[n++] = strdup(p);
free(ds);
return n;
}
|