C:通过argv []将文件名加载到结构中,但我不想要文件类型(例如.txt)?

时间:2014-10-28 02:31:16

标签: c string data-structures linked-list argv

我正在尝试创建数据结构:

typedef struct node_ {
    char* fName;
    char* lName;
    char* origin;
    char* destination;
    int seatNumber;

    struct node_* next;
} Seat;

从.txt文档中扫描行。原点是文档的名称,例如chicago.txt。

我刚刚将argv [i](也就是文件的名称,例如chicago.txt)发送到我的原始函数。哪个有效,但......

现在我需要检查原点是否是目的地,但目的地没有用.txt格式化。 (例如,chicago.txt!=芝加哥)。我考虑过使用strncmp作为前三个字母左右,但这似乎不是一个很好的解决方案。在将argv []发送到相关函数之前,是否有一种简单的方法可以将argv []修改为不包含.txt?或者有没有更好的解决方法,我还没有考虑过?

2 个答案:

答案 0 :(得分:1)

不要尝试改变传递的参数。首先将它们复制到局部变量。此示例从提供的参数中删除.txt扩展名。

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

char fname [100];

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

    char *xptr;

    if (argc < 2) return 1;
    strncpy (fname, argv[1], 99);
    strlwr (fname);
    xptr = strstr (fname, ".txt");
    strncpy (fname, argv[1], 99);       // copy arg again to restore orig case
    if (xptr != NULL)
        *xptr = 0;                      // truncate string
    printf ("%s\n", fname);
    return 0;
}

答案 1 :(得分:1)

您不需要(也不应该)修改任何内容,只需检查您关注的字符即可,如下所示:

鉴于str1是包含.的字符串,str2是我们要比较的字符串:

int result = 0; // will be 1 if same
char *found;

found = strchr(str1,'.');
if (found)
{
   if (strncmp(str1,str2,found-str1) == 0)
     result = 1;
}

注意我没有测试,因此您可能需要在表达式found-str1

中添加1

如何工作:在C中你可以做指针算术strchr找到.的位置,然后我们计算一个字符串与strncmp比较多长时间。