その他は、すでにあなたのコードにいくつかの特定の問題を語っているが、彼らが見逃しているように見える一つのことがc
はint
でなければならないことではなく、同じラインを印刷変更することはありませんa char
。それ以外の場合、EOF
との比較は期待どおりに機能しません。また
、あなたが取得しているセグメンテーション違反があるため、この手順は次のとおりです。
line[n++]=tmp;
printf("\n%s\n",line[n]);
あなたはすでにを持っているあなたはそれを印刷しようとし、次の配列要素にn
をインクリメント。その二行目は次のようになります。
printf("\n%s\n",line[n-1]);
あなただけ(ライセンス「あなたはくそ十分にやりたい」無料で)動作するいくつかのコードをしたい場合は、ここに私のコードライブラリから有用な抜粋です。
私は確信していませんなぜあなたはfgets
は避けるべきだと思っています。実際には非常に便利で非常に安全です。私はあなたがgets
を意味していたと仮定しています。それはあまり便利でなく、完全に安全ではありません。スペースやファイルの終わりではない文字がたくさんある場合は、割り当てられた領域の終わりを超えて楽しい書き込みをするため、コードのバッファオーバーランも発生しやすくなります。あなた自身を教育しているが、その一部は、それが行うことができる方法を確認するために、生産・テスト防弾コードを調べる必要がある場合、すべての手段によって
は、独自のコードを記述します。そして、あなたがでない場合は、あなた自身を教育している、あなたは自由に利用可能なコードを使用しないことで自分自身をやっている。
スニペットは、以下:
#include <stdio.h>
#include <string.h>
#define OK 0
#define NO_INPUT 1
#define TOO_LONG 2
static int getLine (char *prmpt, char *buff, size_t sz) {
int ch, extra;
// Get line with buffer overrun protection.
if (prmpt != NULL) {
printf ("%s", prmpt);
fflush (stdout);
}
if (fgets (buff, sz, stdin) == NULL)
return NO_INPUT;
// If it was too long, there'll be no newline. In that case, we flush
// to end of line so that excess doesn't affect the next call.
if (buff[strlen(buff)-1] != '\n') {
extra = 0;
while (((ch = getchar()) != '\n') && (ch != EOF))
extra = 1;
return (extra == 1) ? TOO_LONG : OK;
}
// Otherwise remove newline and give string back to caller.
buff[strlen(buff)-1] = '\0';
return OK;
}
// Test program for getLine().
int main (void) {
int rc;
char buff[10];
rc = getLine ("Enter string> ", buff, sizeof(buff));
if (rc == NO_INPUT) {
printf ("No input\n");
return 1;
}
if (rc == TOO_LONG) {
printf ("Input too long\n");
return 1;
}
printf ("OK [%s]\n", buff);
return 0;
}
それだfgets
と同じバッファオーバーフロー保護機能を有しており、あまりにもあり、ユーザによって入力された行を検出することができる有用なライン入力機能長いです。長すぎる行の残りの部分をスローし、次の入力操作に影響を与えないようにします。何が価値があるため
pax> ./qq
Enter string> hello
OK [hello]
pax> ./qq
Enter string>
No input
pax> ./qq
Enter string> dfgdfgjdjgdfhggh
Input too long
pax> _
(と自分自身としてこれを手はありません:
サンプルは、「こんにちは」、CTRLD、そして大きすぎる文字列で実行されますあなたがほぼ確実に盗作に巻き込まれてしまうからです。半分くらいのレベルの教育者は、最初のこととしてあなたのコードをネット上で検索します)、これは私がそれにアプローチする方法です。
#include <stdio.h>
#include <stdlib.h>
#define WORDLENGTH 15
#define MAXWORDS 1000
int main (void) {
char *line[MAXWORDS];
int numwords = 0; // Use decent variable names.
int chr, i;
// Code to run until end of file.
for (chr = getchar(); chr != EOF;) { // First char.
// This bit gets a word.
char *tmp = malloc(WORDLENGTH + 1); // Allocate space for word/NUL
i = 0;
while ((chr != ' ') && (chr != EOF)) { // Read until space/EOF
if (i < WORDLENGTH) { // If space left in word,
tmp[i++] = chr; // add it
tmp[i] = '\0'; // and null-terminate.
}
chr = getchar(); // Get next character.
}
line[numwords++] = tmp; // Store.
// This bit skips space at end of word.
while ((chr == ' ') && (chr != EOF)) {
chr = getchar();
}
}
// Now we have all our words, print them.
for (i = 0; i < numwords; i++){
printf ("%s\n", line[i]);
free (line[i]);
}
return 0;
}
これを読んでコメントを書くことで、どのように動作しているかを知ることができます。コメント欄に質問があればお気軽に答えてください。
は、ここでサンプル実行です:
pax$ echo 'hello my name is pax andthisisaverylongword here' | ./testprog
hello
my
name
is
pax
andthisisaveryl
here
えーえ、私は完全にそれについて忘れていたが、私はもうしません!しかし、同じ問題をまだ得ている\\ – user527179
あなたはmalloc(sizeof(char)* WORDLENGTH)を行う必要があります。 –
sizeof(char)は、標準に従って1になることが保証されています。 – EboMike