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如何附加额外的字符,比如s0到最后,这样我就可以将它传递char给一个函数来使用它?

4

4 回答 4

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 回答
0

您不能将任何内容附加到buff,因为您将写入不属于您的内存。您必须在堆上分配内存并复制buff到该内存。确保分配足够的内存,以便实际附加某些内容。

请注意,如果fgets调用没有使用整个 512 个字符,您可以调用 usestrlen(buff)来检查读取和随后写入的字符数buff + strlen(buff)

于 2013-03-28T16:35:18.730 回答
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

strcat()当然,如果您的缓冲区足够大,您可以使用将字符附加到字符串。如果不是,则必须分配更多内存。

例如,请参见此处:http ://www.cplusplus.com/reference/cstring/strcat/

于 2013-03-28T16:33:27.767 回答