sscanf(buffer, "%*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %s %*s %*s %*s %s %*s %s %*s %*s %*s %*s %s", temp, wr1_linkt, wr1_onew, time);
时间: 2023-09-12 19:02:52 浏览: 30
这是一段格式化输入字符串的代码,使用了sscanf函数。它从字符数组buffer中按照一定的格式读取数据,并将读取的结果分别存储在temp、wr1_linkt、wr1_onew和time四个变量中。其中%*s表示跳过一个字符串输入项,%s表示读取一个字符串输入项。具体的输入格式可以根据实际情况进行调整。
相关问题
sscanf char*
sscanf函数是C语言中的一个输入函数,用于从字符串中读取格式化输入。它的原型如下:
```c
int sscanf(const char *str, const char *format, ...);
```
其中,str是要读取的字符串,format是格式字符串,...是要读取的变量。
在引用中的示例中,使用了格式字符串"%*s"。这个格式字符串中的星号*表示忽略匹配的字符串,s表示匹配一个字符串。因此,"%*s"的作用是跳过一个字符串,不进行匹配和保存。在示例中,字符串"aaaaaa"被跳过,最终输出的结果是空字符串。
在引用中的示例中,使用了格式字符串"%[^1-9]"。这个格式字符串中的乘方号^表示匹配除了指定字符范围之外的字符,[^1-9]表示匹配除了数字1到9之外的任意字符。因此,"%[^1-9]"的作用是匹配并保存除了数字1到9之外的字符。在示例中,字符串"abcdef12345aaa"中的数字部分被跳过,最终输出的结果是字符串"abcdef"。
示例代码如下:
```c
#include <stdio.h>
int main() {
char buffer[256] = {0};
// 示例1
sscanf("aaaaaa", "%*s", buffer);
printf("%s\n", buffer); // 输出:空字符串
// 示例2
sscanf("abcdef12345aaa", "%[^1-9]", buffer);
printf("%s\n", buffer); // 输出:abcdef
return 0;
}
```
int main(){ char temp[50], voltage[50], offset[50], wr1_linkt[50], wr1_loop[50], wr1_onew[50], wr0_linkt[50], wr0_loop[50], wr0_onew[50], time[50]; char buffer[1024]; int counter = 0; while(1){ FILE *fp = popen("/usr/bin/sn_core.elf getstat 2>/dev/null","r"); if(fp == NULL){ printf("Failed to run\n"); exit(0); } fgets(buffer,sizeof(buffer),fp); pclose(fp); char *p = strstr(buffer,"mu:"); sscanf(p,"%*[^0123456789]%[^ ]",wr1_loop); printf("%s\n",wr1_loop); p = strstr(buffer,"dms:"); sscanf(p,"%*[^0123456789]%[^ ]",wr1_onew); p = strstr(buffer,"crtt:"); sscanf(p,"%*[^0123456789]%[^ ]",wr1_linkt); p = strstr(buffer,"temp:"); sscanf(p,"%*[^0123456789]%[^ ]",temp); p = strstr(buffer,"Time:"); sscanf(p,"%*[^0-9+-]%[^.]",time); sleep(1); } return 0; } 执行该代码有Segmentation fault错误
这段代码中的 `sscanf` 函数可能会出现越界访问的情况,导致程序崩溃。具体来说,`sscanf` 函数的第二个参数可能会导致越界访问,例如 `sscanf(p,"%*[^0123456789]%[^ ]",wr1_loop);` 这一行代码中的 `%[^ ]`,它表示以空格为分隔符读取字符串,但是如果字符串中没有空格,`sscanf` 函数就会一直读取到字符串结尾,可能会导致越界访问。同样的问题还存在于其他几行代码中。
为了解决这个问题,可以将 `sscanf` 函数的第二个参数中的格式字符串改为 `%49s`,表示最多读取 49 个字符,避免越界访问。同时,还需要注意对获取的字符串进行有效性检查,避免非法字符串导致程序崩溃。
修改后的代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define MAX_BUF_SIZE 1024
int main() {
char temp[50], voltage[50], offset[50], wr1_linkt[50], wr1_loop[50], wr1_onew[50], wr0_linkt[50], wr0_loop[50], wr0_onew[50], time[50];
char buffer[MAX_BUF_SIZE];
int counter = 0;
while(1) {
FILE *fp = popen("/usr/bin/sn_core.elf getstat 2>/dev/null", "r");
if (fp == NULL) {
printf("Failed to run\n");
exit(EXIT_FAILURE);
}
fgets(buffer, sizeof(buffer), fp);
pclose(fp);
char *p = strstr(buffer, "mu:");
if (p) {
sscanf(p, "%*[^0123456789]%49s", wr1_loop);
printf("%s\n", wr1_loop);
}
p = strstr(buffer, "dms:");
if (p) {
sscanf(p, "%*[^0123456789]%49s", wr1_onew);
}
p = strstr(buffer, "crtt:");
if (p) {
sscanf(p, "%*[^0123456789]%49s", wr1_linkt);
}
p = strstr(buffer, "temp:");
if (p) {
sscanf(p, "%*[^0123456789]%49s", temp);
}
p = strstr(buffer, "Time:");
if (p) {
sscanf(p, "%*[^0-9+-]%49s", time);
}
sleep(1);
}
return 0;
}
```
这样修改后,程序应该能够正常运行了。