文字列を折りたたむ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
研修生

文字列を折りたたむ

#1

投稿記事 by 研修生 » 16年前

長い入力行を入力のn字目にある最後の非ブランク文字の後で折りたたむプログラムを作っています。
イメージとしては文字列のn字目に改行をいれて分ける という風だと考えまして
int main()
{
  int c, n, len;
  char s[1000];
 
   printf("何文字目で折りたたみますか?");
   scanf("%d", &n);
   for(int i = 0; i< (c = getchar()) != EOF; ++i){
      s = c;
      len = getline(s,1000);
         if(len > n){
              s[n] += '\n';
              printf("%s\n", s);
         }
         else{
           printf("NG");
         }
   }

   return 0;
}

int getline(char s[/url], int lim)//文字列の文字数を数える
{
	int c, i;
	for(i = 0; i < lim -1 && (c = getchar()) != EOF && c != '\n'; ++i){
		s = c;
	}

	if(c == '\n'){
		s = c;
		++i;
	}
	s = '\0';
	return i;
}



としたところうまくいきません。というのも改行が埋め込めていないようでして・・
3文字目に折りたたむとしてabcdefgと打ち込むと希望としては
abc
defg
なのですが
abcnefgと出力されてしまいます。
s[n] + '\n'の所がちゃんとできていないんだとおもいます。
どうすればうまくいきますか?

tutor

Re:文字列を折りたたむ

#2

投稿記事 by tutor » 16年前

s[n] += '\n';
がダメだと思います。

s[n] = '\n';にしたかったのではないかと思います。

tutor

Re:文字列を折りたたむ

#3

投稿記事 by tutor » 16年前

あ、↑だと一文字消えちゃいますね。
改行以降をひとつずつ後ろにずらさないと

研修生

Re:文字列を折りたたむ

#4

投稿記事 by 研修生 » 16年前

それだと例えば3文字目でabcdefgを入力すると
abc
efgになってa[3]の値がd→'\n'に変わってdが消えちゃうんですよね。
だからd + '\n' という形にしようとしていたいのですが・・
難しいですね。

通りすがり

Re:文字列を折りたたむ

#5

投稿記事 by 通りすがり » 16年前

#include <stdio.h>
#include <string.h>

#define MAXLEN (1000)

int main(void)
{
    char s[MAXLEN];
    int n;

    do {
        printf("何文字目で折りたたみますか? > ");
        scanf("%d", &n), rewind(stdin);
    } while (n <= 0);

    while (printf("文字列を入力してください > "), fgets(s, sizeof(s), stdin)) {
        char *p = s;
        int m = n;

        s[strlen(s)-1] = '\0';
        if (strlen(s) > n) {
            while (m--) {
                putchar(*p++);
            }
            putchar('\n');
        }
        puts(p);
    }
    return 0;
}

tutor

Re:文字列を折りたたむ

#6

投稿記事 by tutor » 16年前

投稿者はポインタが使いたくないとみたので、配列で頑張りました。
文字列自体の中に改行コードを入れたいのかな?



#include<stdio.h>

int main()

{

int c, n, len;
int i,j;
char t2,t1;

char s[1000];


printf("何文字目で折りたたみますか?");


scanf("%d", &n);

for(i = 0; i< (c = getchar()) != EOF; ++i){

s = c;

len = getline(s,1000);

if(len > n){

//s[n] += '\n';

for(j=n;j<len;j++){
t2=s[j];
s[j]=t1;
t1=t2;
}//改行以降を後ろにずらす
s[n]='\n';//開いてるところに改行を入れる


printf("%s\n", s);

}

else{

printf("NG");

}

}



return 0;

}



int getline(char s[/url], int lim)

{

int c, i;

for(i = 0; i < lim -1 && (c = getchar()) != EOF && c != '\n'; ++i){

s = c;

}



if(c == '\n'){

s = c;

++i;

}

s = '\0';

return i;

}

通りすがり

Re:文字列を折りたたむ

#7

投稿記事 by 通りすがり » 16年前

投稿者はポインタを使いたくないと思っている、
というのが仮に本当だとして…。

いつまでもポインタを避けて通るわけにはいきません。
今回のような簡単な問題を使って、慣れておく必要があります。
そうしないと、いつかつまづくことでしょう。

研修生

Re:文字列を折りたたむ

#8

投稿記事 by 研修生 » 16年前

避けて・・るのかもしれません。まだ配列とポインタの関係理解できてないんですよね。
配列でやったらできるのにポインタでやると実体がないのかプログラムに問題が発生しましたとでて
落ちることがよくあるので・・。 tutorさん、通りすがりさんありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る