0

毎回3文字読み込もうとすると問題が発生します。1行ずつ読み、各行で3文字ずつ順番に読みたいです。

次の行にジャンプする\nを見つけるときに行を読むとき...

私はこれを試してみます

while ((getline(&line, &lenght, file)) != -1){
   while ((strncpy(ch, line, 3)) != NULL) { 

        let = replaceletter(tab, ch);

        if (let != 0)
            printf("%c", let);
   }
}

しかし、それは機能しません。最初の3文字を読むだけで、行全体が欲しかったのです。私は本当にこれを行う方法がわかりません、私は助けが必要です、お願いします

4

3 に答える 3

1

2番目のwhileループがどのように機能するのかわかりません。この場合、strncpyはs1、IEchを返します。chはchar*である方がよいです。

それで..最初からすでにNULLであった場合を除いて、chはどのようにして== NULLになりますか?そして、最初にchがNULLの場合(初期化は示されていません)、それはすでにセグメンテーション違反です:)

この行が

while(*(strncpy(ch, line, 3)) != NULL)) {

HTH

于 2012-10-26T03:16:41.613 に答える
0

行の長さが3文字未満の場合、問題が発生する可能性があります。Cでのある種のMin関数の実装を使用するなど、strncpyがコピーするバイト数を指定するためのより適切で堅牢な方法を試してください(詳細はこちら)。

于 2012-10-26T03:11:21.800 に答える
0

あなたのコードでもっとうまくできたかもしれないことがいくつかあります:

  1. コードは、読み取られた文字数をチェックしません。行が短すぎましたか?
  2. strncpyのリターンがチェックされている理由は明らかではありませんNULL。戻りませんNULL
  3. 初期化するかどうか、およびどの値にするかは明確ではありませlinelenght
  4. replaceletter残念ながら、超能力者であり、それが何であるか、それが何をするか、そしてどのようtabにそしてch宣言されているかを推測することは困難です。
  5. なぜループstrncpyで呼ばれるのかは謎です。while
  6. プログラムは、返された文字列の一部である改行文字を考慮していないようです。

言い換えれば、多かれ少なかれ十分な助けを得たいのであれば、あなたの問題を示す小さくて完全で実用的な例を提供することは常に良い考えです。

そのタスクが割り当てられている場合は、おそらく次のように記述します。

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

int main(void)
{
    int  ret     = EXIT_SUCCESS;
    char    *line    = NULL;
    size_t   linecap = 0;
    ssize_t  len;

    do {
        len = getline(&line, &linecap, stdin);
        if (len == -1) {
            if (errno != 0) {
                perror("readline");
                ret = EXIT_FAILURE;
            }
            break;
        }
        if (len < 4)
            continue; /* Line is too short, try again */
        /* printf("The line is: %s", line); */
        printf("First three letters are: '%.*s'\n", 3, line);
    } while(1);

    free(line); /* It is always a good idea to cleanup after yourself */
    return ret;
}

上記のスニペットが自明であることを願っています。ただし、説明が必要な点がある場合は、遠慮なくお問い合わせください。

幸運を!

于 2012-10-26T03:27:43.217 に答える