我正在处理一个函数,它执行一个特定的powershell命令,然后返回输出,如果这是不同的task。函数第一次正确执行,但第二次输出是奇怪的,信号有一个缓冲区溢出在我的代码的某一部分。我找不到它。否则,我无法找出这种行为的其他可能的解决方案。
下面是代码:
char* buffer_reset(char* buffer);
bool jobsreader (const char* printer_name, char* buffer);
int main (int argc, char *argv[]) {
char buffer[1000];
char* pbuffer = buffer;
jobsreader("Microsoft Print to PDF", pbuffer);
pbuffer = buffer_reset(pbuffer);
jobsreader("Microsoft Print to PDF", pbuffer);
return 0;
}
char* buffer_reset(char* buffer) {
char* memory_reset = &buffer[0];
char* start = memory_reset;
while (*memory_reset != '\0') {
*memory_reset = '\0';
memory_reset++;
}
buffer = start;
return buffer;
}
bool jobsreader (const char* printer_name, char* buffer) {
FILE *output;
const char* cmd = "powershell -Command Get-PrintJob '";
int dim = (strlen(cmd)+1+strlen(printer_name)+1+2);
char powershell[dim]; // + 1 per carattere \0 + 1 per carattere \0 + 2 per stringa "'\0"
strcat(powershell, cmd);
strcat(powershell, printer_name);
strcat(powershell, "'");
fflush(stdout);
printf("%s\n", powershell);
output = popen(powershell, "r"); // Esegue il comando shell e restituisce un puntatore a FILE
if (output == NULL) {
printf("Error in executing the command: are you sure this printer exists?\n");
pclose(output); // Chiude il file
return false;
} else {
char c;
// Se c'è un processo in corso (quindi output della shell diverso da EOF)
while ((c = getc(output)) != EOF) {
*buffer = c;
printf("%c", c); // Stampa a video del processo in corso
buffer++;
}
printf("\n");
*buffer = '\0';
pclose(output); // Chiude il file
return true;
}
}
字符串
输出1:powershell -Command Get-PrintJob 'Microsoft Print to PDF'(OK)输出2,3,4.:powershe@powershell -Command Get-PrintJob 'Microsoft Print to PDF'(WRONG)
有人能帮帮我吗?
我想输出并执行以下powershell命令:Get-PrintJob<printer_name>
1条答案
按热度按时间2ledvvac1#
问题是这两行:
字符串
数组没有初始化,它的内容是 * 不确定的 *。
更具体地说,它不能被用作空终止字符串,这是
strcat
所期望的。因此,您将具有 *undefined行为 *。您必须开始使用
strcpy
调用:型
或者,您可以使用
snprintf
而不是多个strcpy
和strcat
调用:型