C 在输入文件中搜索并打印所有不重复的结构名称
注意第10行和第22行的输出。一种方法是为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
,
,)
,执行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