C 在输入文件中搜索并打印所有不重复的结构名称

C 在输入文件中搜索并打印所有不重复的结构名称,c,arrays,string,struct,getline,C,Arrays,String,Struct,Getline,注意第10行和第22行的输出。一种方法是为,,),执行strhr并从末尾删除char。但是,如果非字母字符的数量增加,这不是一个干净的解决方案 注意:我找到的最佳解决方案是。由于来自的输入,下面的代码处理结构名*ptr的所有情况,结构名称{},结构{} [root@mnm-server programs]# ./a.out /usr/src/linux/drivers/net/ethernet/smsc/smsc911x.c 0. smsc911x_data 1. smsc911x_ops

注意第10行和第22行的输出。一种方法是为
执行strhr
并从末尾删除char。但是,如果非字母字符的数量增加,这不是一个干净的解决方案

注意:我找到的最佳解决方案是。

由于来自的输入,下面的代码处理
结构名*ptr的所有情况
结构名称{}
结构{}

[root@mnm-server programs]# ./a.out /usr/src/linux/drivers/net/ethernet/smsc/smsc911x.c
 0. smsc911x_data
 1. smsc911x_ops
 2. smsc911x_platform_config
 3. phy_device
 4. mii_bus
 5. net_device
 6. napi_struct
 7. regulator_bulk_data
 8. clk
 9. platform_device
10. smsc911x_data,
11. sk_buff
12. net_device_stats
13. netdev_hw_addr
14. sockaddr
15. ethtool_drvinfo
16. ethtool_eeprom
17. ethtool_ops
18. net_device_ops
19. ures,
20. resource
21. device_node
22. smsc911x_data))
23. dev_pm_ops
24. of_device_id
25. platform_driver

你也应该考虑这样的情况:<代码>结构名称*PTR;<代码>,
结构名称{},结构{}`在找到“struct”之后,跳过所有空白字符可能更容易。如果下一个字符是
isalpha
,则您将其和所有字母数字字符作为结构名称。@DanielJour:多亏了您的输入,我修改了程序,该程序正确地打印了所有大小写。我还需要为结构名
文件解析所有预处理文件。我从不向shell返回负数<代码>返回-1main()
中的code>无效。返回shell时
0
表示正常完成。任何其他正数表示错误条件。虽然您可以在程序中自由返回负数,但您不能向shell返回负数。@DavidC.Rankin:是的,谢谢。。虽然我猜为什么编译器没有对此提出任何警告。我将返回错误代码从
stdlib.h
更改为
EXIT\u SUCCESS
EXIT\u FAILURE
。第20行上的
sprintf()
不应该是
strncpy()
吗?
[root@mnm-server programs]# ./a.out /usr/src/linux/drivers/net/ethernet/smsc/smsc911x.c
 0. smsc911x_data
 1. smsc911x_ops
 2. smsc911x_platform_config
 3. phy_device
 4. mii_bus
 5. net_device
 6. napi_struct
 7. regulator_bulk_data
 8. clk
 9. platform_device
10. smsc911x_data,
11. sk_buff
12. net_device_stats
13. netdev_hw_addr
14. sockaddr
15. ethtool_drvinfo
16. ethtool_eeprom
17. ethtool_ops
18. net_device_ops
19. ures,
20. resource
21. device_node
22. smsc911x_data))
23. dev_pm_ops
24. of_device_id
25. platform_driver
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

/* Search and Print all non-duplicate struct names inside input file */
int main(int argc, char *argv[])
{
        char temp[64], buf[64], filename[128], array[1024] = "";
        char *ptr, *line = NULL;
        size_t len;
        int count = 0, flag = 0;
        FILE *fp;

        if (argc < 2) {
                printf("enter file name at cmd line...\n");
                return EXIT_FAILURE;
        }

        sprintf(filename, argv[1], strlen(argv[1]));
        fp = fopen(argv[1], "r");
        if (!fp) {
                printf("File could not be opened: %s\n", argv[1]);
                return EXIT_FAILURE;
        }

        while ((getline(&line, &len, fp)) != -1) {
                ptr = flag ? line : strstr(line, "struct ");
                if (ptr) {
                        if (!flag)
                                ptr += strlen("struct ");
                        while (*ptr == ' ')
                                ptr++;

                        len = 0;
                        while (isalnum(*ptr) || *ptr == '_' || *ptr == '{' || *ptr == '}') {
                                if (*ptr == '{') {
                                        flag++;
                                }
                                else if (*ptr == '}') {
                                        len = 0;
                                        flag--;
                                        do {
                                                ptr++;
                                        } while (*ptr == ' ');
                                        ptr--;
                                }
                                else if ((*ptr != '{') || (*ptr != '}')) {
                                        len++;
                                }
                                ptr++;
                        }

                        if (len && !flag) {
                                ptr -= len;
                                snprintf(temp, len+1, "%s", ptr);

                                if (!strstr(array, temp)) {
                                        sprintf(buf, "%2d. ", count++);
                                        strcat(buf, temp);
                                        strcat(array, buf);
                                        strcat(array, "\n");
                                }
                        }
                }
        }

        fclose(fp);
        if (line)
                free(line);
        printf("%s\n", array);
        return EXIT_SUCCESS;
}
[root@server]# cat hworld.c
#include <stdio.h>

int main()
{
        printf("hello world\n");
        return 0;
}

[root@server]# gcc -Wall --save-temps hworld.c
[root@server]# ./find_structs hworld.i
 0. _IO_FILE
 1. _IO_marker
 2. _IO_FILE_plus