【问题标题】:C How to split variable read from .txt file scanfC如何拆分从.txt文件scanf读取的变量
【发布时间】:2012-03-01 00:36:01
【问题描述】:

有人可以帮我解决这个问题吗?我有一个.txt 文件,我正在通过fopen 使用C 读取该文件,如下所示。我可以将文本作为变量显示到屏幕上,这很好。但是,我从文件中读取的文本是逗号分隔的。如何将文本文件中的字符串拆分为两个变量而不是一个?

示例

用户名、密码

我希望最终输出是

var1 = 用户名 var2 = 密码

这是我的代码。

inFile = fopen("logfile.txt", "r"); /*This opens the file */    
if (inFile == NULL)            /*Checks that the file exists*/ {        
    printf("\nThe file %c was not opened successfully.", fileName);     
    printf("\nPlease check that you entered the file name correctly.\n");       
    exit(1);    
}   
while (fscanf(inFile, "%s", text) !=EOF) /*Reads and displays the file*/        
    printf("%s\n", text);   
fclose(inFile);

某种修复

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

int main (void) { 
    char *s; 
    char test[50];
    int i=0;
    char str[] = 
        "username,password";
    printf ("%s\n", str); 
    s = strtok (str, ","); 
    // 
    while (s != NULL) { 
        printf ("%s\n", s); 

        s = strtok (NULL, ","); 

} 
        system("pause");
    return 0; 

} 

【问题讨论】:

  • 您可能正在寻找的是strtok。此外,在这种情况下,fgetsfscanf 更合适,因为在这里使用它可能会导致缓冲区溢出。
  • 在条件和{ 之间添加注释是一种惯例,如if (condition) /* here */ {。 C 编译器不介意。你的人类观众可能会觉得它很不寻常,因为它很不寻常。
  • 如果是 C 应用程序,为什么还要包含 iostream
  • 谁能帮我回答这个问题。这样我就可以包含系统(“暂停”)功能。只使用 C 6 天。

标签: c string split scanf


【解决方案1】:

strtok 函数正是您要找的

【讨论】:

  • 不是家庭作业,只是用不同的方式为我的对话应用程序存储密码。
  • 好吧,谢谢我设法让 strok 工作,但最后一个问题是如何将拆分存储到变量中。抱歉,对于 PHP 的 C 新手提出的问题。我上面的代码示例。
  • 请注意,strtok() 有其自身的问题,尤其是在代码可重用的情况下。从根本上说,您不能在库函数中安全地使用strtok()。如果可用,strtok_r() 可以改为在库函数中使用。 strtok()strtok_r() 还存在其他常见问题,例如它们会踩踏正在分析的字符串(有时无关紧要,有时确实如此),如果可以的话,您无法判断找到了哪个分隔符是多个,并且它们将任何分隔符序列视为等效,因此您不能像 CSV 中那样有空字段:field1,,field3
  • 密码应该永远以明文形式存储。从那开始。
  • 这只是一个实验,我相信他们会被发布时间加密。
【解决方案2】:

过程是使用strtok函数。该函数所做的是将分隔符(在本例中为,)更改为\0(空)字符。然后它传回一个指针,指向现在由\0 终止的字符串的开头。如果再次运行并传入 NULL,它将再次基于分隔符拆分(如果存在),并将指针传回字符串的第二部分。以下是需要添加的代码:

#include <string.h>
char* var1;
char* var2;

然后在你的while循环中:

{
    var1 = strtok(text,",");
    var2 = strtok(NULL,",");
    printf("%s<NOT A ','>%s\n", var1,var2);
}

这对字符串文本的作用如下。当我们从文件中得到它时,text =

/------------------------------------\
|u|s|e|r|n|a|m|e|,|p|a|s|s|w|o|r|d|\0|
\------------------------------------/

while 循环的第一行将其更改为 text =

/-------------------------------------\
|u|s|e|r|n|a|m|e|\0|p|a|s|s|w|o|r|d|\0|
\1------------------------------------/

其中var1 指向1 上方的字母,因此var1 = username。请注意,这意味着如果您在 text 上运行 printf,您还将获得用户名。第二行之后,text =

/-------------------------------------\
|u|s|e|r|n|a|m|e|\0|p|a|s|s|w|o|r|d|\0|
\1------------------2-----------------/

现在var1 指向字符串“用户名”,var2 指向字符串“密码”。如果你 printf text,你仍然会得到“用户名”。

请注意,如果您想要获得两个以上的变量,则需要在尝试使用字符串之前确保 strtok 没有返回 NULL 的安全措施。

还要注意,如果你修改text,你也会弄乱var1var2。如果您希望以更永久的方式保存信息,我建议将strcpy 用于另一个字符串。

【讨论】:

  • 谢谢彼得一个最佳答案我从中学到了很多,并得到了它的工作上帝保佑你。
【解决方案3】:

如果您可以确保归档分隔符是“,”并且输入数据只有两个字段。 因为strtok不是可重入函数所以我通常在已经知道输入数据格式的情况下使用scanf而不是strtok

int re;
char line[200];
char usernme[100];
char password[100];
while (fgets(line, 200, inFile) != NULL)
{
    /*Reads and displays the file*/        
    re = sscane(line, "%[^","],%s", username, password);
    if(re == 2)
    {
        printf("Usarname = %s, Password = = %d\r\n", username, password);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    相关资源
    最近更新 更多