0

私がやっている:

FILE *in;
extern FILE *popen();
char buff[512];

if (!(in = popen("df / | tail -n +2 | awk '{ print $1 }'", "r"))) {
    exit(1);
}

while (fgets(buff, sizeof(buff), in) != NULL ) {
    printf("Output: %s", buff);
}

それで、最後に追加の文字を追加して、これを関数に渡して操作できるbuffようにするにはどうすればよいですか?s0char

4

4 に答える 4

0

buff自分のものではないメモリに書き込むため、 に何も追加することはできません。ヒープにメモリを割り当て、buffそのメモリにコピーする必要があります。実際に何かを追加できる十分なメモリを割り当てるようにしてください。

fgets呼び出しで 512 文字全体が使用されなかった場合は、 use を呼び出しstrlen(buff)て、読み取りとその後の書き込みの文字数を確認できます。buff + strlen(buff)

于 2013-03-28T16:35:18.730 に答える
0

strcat()もちろん、バッファが十分に大きい場合は、文字を文字列に追加するために使用できます。そうでない場合は、より多くのメモリを割り当てる必要があります。

たとえば、ここを参照してください: http://www.cplusplus.com/reference/cstring/strcat/

于 2013-03-28T16:33:27.767 に答える
0

このような何かがトリックを行うことができます:

char buff[512];
size_t pos = 0;
...
while (fgets(buff + pos, sizeof(buff) - pos, in) != NULL) {
    printf("Output: %s\n", buff + pos);
    pos += strlen(buff + pos);
}

ファイルからではなく文字を追加したい場合は、アイデアを拡張できます。

strcpy(buff + pos, "s0");
pos += strlen(buff + pos);

また

buf[pos++] = 's';
buf[pos++] = '0';
buf[pos++] = '\0';

バッファがオーバーフローしないようにする必要があります。

于 2013-03-28T16:36:23.853 に答える
0

それを行う非常にC ++の方法:

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <string>
#include <sstream>
int main() {
  FILE *in;
  char buff[512];
  if (!(in = popen("df /", "r"))) {
    return 1;
  }
  fgets(buff, sizeof(buff), in); //discard first line
  while (fgets(buff, sizeof(buff), in) != NULL ) {
    std::istringstream line(buff);
    std::string s;
    line >> s; // extract first word
    s += "s0"; // append something
    std::cout << s << '\n';
  }
  return 0;
}

元のタイトルは c++ でした。文字列の編集については、過度に最適化したい場合を除き、C よりも C++ をお勧めします。

于 2013-03-28T16:40:18.827 に答える