如何分割从.txt文件scanf读取的变量

如何分割从.txt文件scanf读取的变量,c,string,split,scanf,C,String,Split,Scanf,有人能帮我解决这个问题吗?我有一个.txt文件,我正在使用C通过fopen读取该文件,如下所示。我可以将文本作为变量显示在屏幕上,这很好。但是,我从文件中读取的文本是逗号分隔的。如何将文本文件中的字符串拆分为两个变量而不是一个变量 例子 用户名、密码 我希望最终输出是 var1=用户名 var2=密码 这是我的密码 inFile = fopen("logfile.txt", "r"); /*This opens the file */ if (inFile == NULL)

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

例子 用户名、密码

我希望最终输出是

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; 

} 
#包括
#包括
#包括
int main(void){
char*s;
炭试验[50];
int i=0;
字符str[]=
“用户名、密码”;
printf(“%s\n”,str);
s=strtok(str,“,”);
// 
而(s!=NULL){
printf(“%s\n”,s);
s=strtok(空,“,”);
} 
系统(“暂停”);
返回0;
} 

strtok功能是您正在寻找的

strtok功能是您正在寻找的

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

#include <string.h>
char* var1;
char* var2;
while循环的第一行将对其进行更改,以便
text
=

/-------------------------------------\
|u|s|e|r|n|a|m|e|\0|p|a|s|s|w|o|r|d|\0|
\1------------------------------------/
/-------------------------------------\
|u|s|e|r|n|a|m|e|\0|p|a|s|s|w|o|r|d|\0|
\1------------------2-----------------/
其中
var1
指向1上方的字母,因此
var1=username
。请注意,这意味着如果在
文本上运行printf,您还将获得用户名。在第二行之后,
text
=

/-------------------------------------\
|u|s|e|r|n|a|m|e|\0|p|a|s|s|w|o|r|d|\0|
\1------------------------------------/
/-------------------------------------\
|u|s|e|r|n|a|m|e|\0|p|a|s|s|w|o|r|d|\0|
\1------------------2-----------------/
现在
var1
指向字符串“username”,而
var2
指向字符串“password”。如果您打印f
文本
,您仍将获得“用户名”

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


还要注意,如果修改
文本
,也会弄乱
var1
var2
。如果希望以更持久的方式保存信息,我建议对另一个字符串使用
strcpy

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

#include <string.h>
char* var1;
char* var2;
while循环的第一行将对其进行更改,以便
text
=

/-------------------------------------\
|u|s|e|r|n|a|m|e|\0|p|a|s|s|w|o|r|d|\0|
\1------------------------------------/
/-------------------------------------\
|u|s|e|r|n|a|m|e|\0|p|a|s|s|w|o|r|d|\0|
\1------------------2-----------------/
其中
var1
指向1上方的字母,因此
var1=username
。请注意,这意味着如果在
文本上运行printf,您还将获得用户名。在第二行之后,
text
=

/-------------------------------------\
|u|s|e|r|n|a|m|e|\0|p|a|s|s|w|o|r|d|\0|
\1------------------------------------/
/-------------------------------------\
|u|s|e|r|n|a|m|e|\0|p|a|s|s|w|o|r|d|\0|
\1------------------2-----------------/
现在
var1
指向字符串“username”,而
var2
指向字符串“password”。如果您打印f
文本
,您仍将获得“用户名”

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


还要注意,如果修改
文本
,也会弄乱
var1
var2
。如果您希望以更持久的方式保存信息,我建议对另一个字符串使用strcpy。

如果您可以确保字段分隔符为“”,并且输入数据只有两个字段。 由于
strtok
不是一个可重入函数,所以当输入数据格式已知时,我通常使用
scanf
insead of
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);
    }
}

如果您可以确保字段分隔符为“”,并且输入数据只有两个字段。 由于
strtok
不是一个可重入函数,所以当输入数据格式已知时,我通常使用
scanf
insead of
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);
    }
}

您可能正在寻找的是
strtok
。此外,在这种情况下,
fgets
fscanf
更合适,因为在这里使用它可能会导致缓冲区溢出。通常在条件和
{
之间添加注释,如
if(condition)/*此处*/{
。C编译器不介意;您的人类读者可能会发现它令人困惑,因为它是不寻常的。如果它是C应用程序,为什么要包括
iostream
?有人能帮我回答这个问题吗?这样我就可以包括系统(“暂停”)函数。仅使用C 6天。您可能正在寻找的是
strtok
。此外,在这种情况下,
fgets
fscanf
更合适,因为在这里使用它可能会导致缓冲区溢出。通常在条件和
{/code>之间放置注释,如
if(条件)中所示/*这里*/{
。C编译器不介意;您的人类读者可能会发现它很混乱,因为它不寻常。如果它是C应用程序,为什么要包括
iostream
?有人能帮我回答这个问题吗?这样我就可以包括系统(“暂停”)函数。只使用C 6天。不是作业,只是为了我的dialog应用程序乱搞不同的密码存储方式。很好,谢谢我设法让strok工作,但最后一个问题是如何将拆分存储到变量中。很抱歉一个PHP新手向C提出的问题。上面是我的代码示例。请注意
s