gpt4 book ai didi

c - 读取/处理程序

转载 作者:太空狗 更新时间:2023-10-29 16:10:38 25 4
gpt4 key购买 nike

我正在尝试编写一个具有获取进程详细信息功能的脚本。

目前为止

#include <stdio.h>
#include <string.h>
#include <ctype.h>

char* getField(FILE* file, char* prop, int len){
char line[100], *p;

while(fgets(line, 100, file)) {
if(strncmp(line, prop, len) != 0)
continue;

p = line + len + 1;
while(isspace(*p)) ++p;

break;
}

return p;
}

int main(int argc, char *argv[]) {

char tgid[40], status[40], *s, *n;
FILE* statusf;

printf("Please Enter PID\n");

if (fgets(tgid, sizeof tgid, stdin)) {
//Remove new line
strtok(tgid, "\n");
snprintf(status, 40, "/proc/%s/status", tgid);

statusf = fopen(status, "r");
if(!statusf){
perror("Error");
return 0;
}

s = getField(statusf, "State:", 6);
n = getField(statusf, "Name:", 5);

printf("State: %s\n", s);
printf("Name: %s\n", n);

}else{
printf("Error on input");
}

fclose(statusf);
return 1;
}

我仍然发现指针和内存有点模糊。当我在没有

的情况下运行此脚本时
n = getField(statusf, "Name:", 5);

我得到了正确的输出(例如 S - Sleeping);

但是当我调用函数来获取进程名称时,我似乎得到了两个相同的输出,例如。

状态:ntary_ctx名称:ntary_ctx

这甚至不是正确的名称。我认为问题一定是函数变量保持了值(value)。但我认为当一个函数返回时,它的内存就会从堆栈中弹出。

最佳答案

代码正在重新调整指向局部变量的指针。
那是无效的 - 它是未定义的行为 (UB)。 @stark
这解释了“我似乎对两者都得到了相同的输出”,因为一个可能的 UB 是重复使用了相同的缓冲区。另一种可能性是代码崩溃,以及其他候选者。

// Bad code
char* getField(FILE* file, char* prop, int len){
char line[100], *p;
...
p = line + len + 1;
...
return p; // `p` points to `line[]`
}

代码需要复制。可以通过分配或传入目的地来完成此操作,如下所示。

char* getField(FILE* file, char *dest, const char* prop, int len){
if (problem) return NULL;
...
return strcpy(dest, p);
}

// Example call
char prop_state[100];
if (getField(statusf, prop_state, "State:", 6)) Success();
else Handle_Problem();
...
char prop_name[100];
if (getField(statusf, prop_name, "Name:", 6)) Success();
...

更好的代码会传入 dest 的大小,因此 getField() 可以处理它

char* getField(FILE* file, char *dest, size_t size, const char* prop, int len){
...
if (strlen(p) >= size) return NULL; // Not enough room
return strcpy(dest, p);
}

// usage
if (getField(statusf, prop_state, sizeof prop_state, "State:", 6)) Success();
...

关于c - 读取/处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42438783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com