プロが教える店舗&オフィスのセキュリティ対策術

環境はC言語です。
一行から不定数の文字列を入力したいと考えています。
fscanfは使わずに、fgetsとsscanfを使って実現させたいと考えています。
以下ではうまくいきませんでした。

--sorce--

char temp[1024], buf[1024];
while(fgets(stdin, 1024, buf) != NULL)){    //ファイルで標準入力でもどっちも可能
 while(sscanf(buf, "%s",temp) != EOF){
  printf("%s ", temp);
 }
}

--input--
red blue black yellow white red
red red black yellow
white blue
red blue blue

--理想output--
red blue black yellow white red red red black yellow white blue red blue blue

よろしくおねがいします。

A 回答 (4件)

#include <string.h>


#include <ctype.h>
#include <stdio.h>
char temp[1024], buf[1024];
void main(void)
{
 char *p;
 while(fgets(buf, 1024, stdin) != NULL){
  p = buf;
  while(sscanf(p, "%s",temp) != EOF){
   printf("%s ", temp);
   p += strlen(temp);
   while ((*p) && (isspace(*p))) p++;
  }
 }
}

・fgetsの引数が間違っている(bufとstdinが逆) 40点減点
・括弧閉じが1つ多い 40点減点
・bufからsscanfしても常に同じ文字列しか読み込まないので自分でポインタを進めないといけないのをやってない 5点減点

100点満点で15点。
    • good
    • 0

「行頭の空白文字」は「大量」じゃなくてもダメじゃないかなと無意味な突っ込みをしてみる>#3.


%n?
    • good
    • 0

もう1つ。

「入力した行の先頭に半角スペースが大量にあった時」に対処してないので、自分で直してみましょう。
    • good
    • 0

因みに、1行が1024バイト以上の場合1024バイト目と1025バイト目にまたがる文字列が2つに分離してしまうバグがあるが、対処してない。



fgetsで一定の文字列を読み込む場合は、本当であれば、読み込んだ行の末尾に'\n'があるかどうかで、1行の終わりまで読み込んだか、1行がバッファサイズよりも長くて読み込まれていない続きがあるか、判定して処理を変えるべき。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!