c - 从 Ubuntu 终端读取数据并将其存储在 C 中的不同变量中

标签 c

我正在编写一个程序来存储 iwscan Ubuntu 命令的信息。我实际上正在正确读取使用该信息创建的文件;然而,当尝试存储数据(字符串中的 ESSID、整数中的 channel 和 double 中的质量)时,我在处理字符串以提取数据时遇到了一些问题...

代码如下:

#include <stdlib.h>
#include <string.h> 
#include <unistd.h>
#include <stdio.h>

char *tratarEssid(char *cadena);
int tratarCanal(char *cadena);
double tratarCalidad(char *cadena);
int tratarCanal(char *cadena){
    char resultado[2];
    strncpy(resultado,cadena+9,2);
    int canal;
    canal=atoi(resultado);
    return canal;
}
double tratarCalidad(char *cadena){
    char resultado[6];
    strncpy(resultado,cadena+8,6);
    char num[2];
    char den[2];
    strncpy(num,resultado,2);
    if(strlen(resultado)==5)
         strncpy(den,resultado+3,2);
    else
         strncpy(den,resultado+2,2);
    double numerador=atof(num);
    double denominador=atof(den);
    double calidad=numerador/denominador;
    return calidad;
 }
 char *tratarEssid(char *cadena){
      char *essid;
      essid=(char *)malloc(sizeof(char)*10);
      strncpy(essid,cadena+7,10);
      return essid;
 }
 int main(){
    int i;
    const char *CHECKCANAL = "Channel:";
    const char *CHECKQUALITY = "Quality=";
    const char *CHECKESSID = "ESSID:";
    double calidad;
    int canal;
    char *essid;
    char cadena[20];
    system("iwlist wlan0 scan | egrep \"(Channel|Signal level|ESSID)\">/home/wein/Escritorio/basic/bin/Debug/Lista.txt");
    printf("Lista hecha\n");
    lista=fopen("Lista.txt","r");
    printf("Lista abierta\n");
    while (!feof(lista)){
            fgets(cadena,20,lista);
            printf("%s",cadena);
            if (strncmp(CHECKCANAL,cadena,strlen(CHECKCANAL))==0){
                canal=tratarCanal(cadena);
                printf("CANAL: %d\n",canal);
                }

             else if (strncmp(CHECKQUALITY,cadena,strlen(CHECKCANAL))==0){
                calidad=tratarCalidad(cadena);
                printf("CALIDAD: %f",calidad);
                }
             else if(strncmp(CHECKESSID,cadena,strlen(CHECKESSID))==0){
                essid=tratarEssid(cadena);
                printf("ESSID: %s\n",essid);
                }
      }
      return 0;
 }

所以我知道我的问题在于过滤和处理有用字符串的条件,只是我不知道为什么 strncmp 不能正常工作(它应该将行的开头与字符串的内容进行比较,或者这就是想法),因此,函数无法正常工作(也许我也搞砸了函数......)。还有其他机会正确处理我收到的字符串吗?

char[] cadena 的 printf 的输出就像这样

Channel:11
Frequency:2.462 GH
z (Channel 11)
Quality=57/70  Sig
nal level=-53 dBm  
ESSID:"eduroam"

我应该能够从那里提取 ESSID、质量和 channel 。

感谢您收到的任何想法/建议/帮助。

最佳答案

在 cadena[] 上使用 strtok() 将字符串划分为标记,

token[0]=strtok(cadena,"\n")  //considering the output you gave each date is in newline
token[1]=strtok(NULL,"\n")
token[2]=strtok(NULL,"\n")
token[3]=strtok(NULL,"\n")
token[4]=strtok(NULL,"\n")
token[5]=strtok(NULL,"\n")

然后使用sscanf()从 token 中获取所需的数据,

sscanf(token[5],"ESSID:%s",ESSID);
sscanf(token[3],"Quality=%d/%d",&q1,&q2 )  //quality=q1/q2
sscanf(token[0],"Channel:%d",&channel)

这将从字符串 cadena[] 中给出所需的值。

关于c - 从 Ubuntu 终端读取数据并将其存储在 C 中的不同变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22514196/

相关文章:

c - 为什么 readdir 在第一次调用目录后下次调用 readdir 时返回 null 和 I/O 错误

c - make64 high32 low32 在 Mac OS/Linux 上的功能

c - 如何检查是否在宏中从 C 设置了环境变量

c - 段错误: 11 - Simple linked list c

c - 函数中的输入与 main 中的输入混合

c - 在 yacc 中使用 union 来表示结构

c++ - Matlab 到 C 或 C++

c - Travis-CI 上的 GTK2 链接错误

c - 具有函数指针数组的结构

c - 为什么下面的代码行会导致我的程序出现段错误?