String 作为输出的奇怪形状(字符串)-C语言

String 作为输出的奇怪形状(字符串)-C语言,string,String,所以我有个问题。我必须分开电子邮件的名字、姓氏和主机名。 例如: 西风。extreme@gmail.com>>输入 输出= 名字=西风 姓氏=极端 主机名=gmail.com 我没有得到想要的结果。我得到一些奇怪的形状作为输出 代码: #include <stdio.h> int main() { char email[40], first[20],last[20],host[30]; printf("Enter the email= "); gets(email); int i;

所以我有个问题。我必须分开电子邮件的名字、姓氏和主机名。 例如:

西风。extreme@gmail.com>>输入

输出=

名字=西风

姓氏=极端

主机名=gmail.com

我没有得到想要的结果。我得到一些奇怪的形状作为输出

代码:

#include <stdio.h>

int main()
{
char email[40], first[20],last[20],host[30];
printf("Enter the email= ");
gets(email);
int i;
while(email[i]!='\0')
{
    while(email[i]!='.')
    {
        first[i]=email[i];
        i++;
    }
    while(email[i]!='@')
    {
        last[i]=email[i];
        i++;
    }
    while(email[i]!='\0')
    {
        host[i]=email[i];
        i++;
    }
}
puts(first);
puts(last);
puts(host);
}
#包括
int main()
{
字符电子邮件[40],第一个[20],最后一个[20],主机[30];
printf(“输入电子邮件=”);
获取(电子邮件);
int i;
while(电子邮件[i]!='\0')
{
while(电子邮件[i]!='。)
{
第一[i]=电子邮件[i];
i++;
}
while(电子邮件[i]!='@'))
{
最后[i]=电子邮件[i];
i++;
}
while(电子邮件[i]!='\0')
{
主机[i]=电子邮件[i];
i++;
}
}
放(第一);
放(最后);
放置(主机);
}

所以我更新了代码,现在唯一的问题是最后的输出

在host name=gmail.com之后打印,但也会打印一些额外的形状。这些是笑脸和一些奇怪的符号

代码

#include <stdio.h>

int main()
{
char email[40], first[20],last[20],host[30];
printf("Enter the email= ");
gets(email);
int i=0,j;
while(email[i]!='.')
{
    first[i]=email[i];
    i++;
}
i=0;
while(email[i]!='@')
{
    last[i]=email[i];
    i++;
}
j=i;
i=0;
while(email[j]!='\0')
{
    host[i]=email[j];
    j++;
    i++;
}
printf("First Name= ");
puts(first);
printf("Last name= ");
puts(last);
printf("Host name= ");
puts(host);
}
#包括
int main()
{
字符电子邮件[40],第一个[20],最后一个[20],主机[30];
printf(“输入电子邮件=”);
获取(电子邮件);
int i=0,j;
while(电子邮件[i]!='。)
{
第一[i]=电子邮件[i];
i++;
}
i=0;
while(电子邮件[i]!='@'))
{
最后[i]=电子邮件[i];
i++;
}
j=i;
i=0;
while(电子邮件[j]!='\0')
{
主机[i]=电子邮件[j];
j++;
i++;
}
printf(“First Name=”);
放(第一);
printf(“Last name=”);
放(最后);
printf(“主机名=”);
放置(主机);
}

所以我更新了代码,现在唯一的问题是最后的输出

在host name=gmail.com之后打印,但也会打印一些额外的形状。这些是笑脸和一些奇怪的符号

代码

#include <stdio.h>

int main()
{
char email[40], first[20],last[20],host[30];
printf("Enter the email= ");
gets(email);
int i=0,j;
while(email[i]!='.')
{
    first[i]=email[i];
    i++;
}
i=0;
while(email[i]!='@')
{
    last[i]=email[i];
    i++;
}
j=i;
i=0;
while(email[j]!='\0')
{
    host[i]=email[j];
    j++;
    i++;
}
printf("First Name= ");
puts(first);
printf("Last name= ");
puts(last);
printf("Host name= ");
puts(host);
}
#包括
int main()
{
字符电子邮件[40],第一个[20],最后一个[20],主机[30];
printf(“输入电子邮件=”);
获取(电子邮件);
int i=0,j;
while(电子邮件[i]!='。)
{
第一[i]=电子邮件[i];
i++;
}
i=0;
while(电子邮件[i]!='@'))
{
最后[i]=电子邮件[i];
i++;
}
j=i;
i=0;
while(电子邮件[j]!='\0')
{
主机[i]=电子邮件[j];
j++;
i++;
}
printf(“First Name=”);
放(第一);
printf(“Last name=”);
放(最后);
printf(“主机名=”);
放置(主机);
}
C字符串(
char
指针)应为空。这意味着您的字符串的末尾需要一个
'\0'
字符,以便字符串操作函数(如
放置
strlen
)知道它们的结尾,这与存储字符串长度的其他语言不同。您看到的“奇怪形状”只是在字符串末尾被解释为字符后存储的随机数据。当您调用
put
时,它只会将字节作为字符输出,直到随机找到一个值为
'\0'

您可以通过在写入字符串的每个块之后的字符串末尾添加
'\0'
字符来解决此问题

while(email[i]!='.')
{
    first[i]=email[i];
    i++;
}
email[i] = '\0'; //same thing as email[i] = 0; but using a char makes what
                 //you're doing clearer
C字符串(
char
指针)应为空。这意味着您的字符串的末尾需要一个
'\0'
字符,以便字符串操作函数(如
放置
strlen
)知道它们的结尾,这与存储字符串长度的其他语言不同。您看到的“奇怪形状”只是在字符串末尾被解释为字符后存储的随机数据。当您调用
put
时,它只会将字节作为字符输出,直到随机找到一个值为
'\0'

您可以通过在写入字符串的每个块之后的字符串末尾添加
'\0'
字符来解决此问题

while(email[i]!='.')
{
    first[i]=email[i];
    i++;
}
email[i] = '\0'; //same thing as email[i] = 0; but using a char makes what
                 //you're doing clearer

假设格式总是第一位的。last@host...,请使用以下代码:

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

int main()
{
    char email[40], first[20],last[20],host[30],name[40];
    int firstDot,atSymbol;
    int i;
    int length;
    char *token;

    printf("Enter the email= ");
    gets(email);
    length = strlen(email);
    for(i=0;i<length;i++){

        if(email[i]=='.')
        {
            firstDot = i;
        }
        else if(email[i]=='@')
        {
            atSymbol = i;
        }
    }
    strncpy(name,email,atSymbol);
    name[atSymbol]= '\0';
       token = strtok(name, ".");

       /* walk through other tokens */
       while( token != NULL ) 
       {
          printf( "%s\n", token );
          token = strtok(NULL, ".");
       }
       strncpy(host,email+atSymbol,length-atSymbol);
    host[length-atSymbol] = '\0';
    puts(host);
}
#包括
#包括
int main()
{
char email[40],first[20],last[20],host[30],name[40];
int firstDot,atSymbol;
int i;
整数长度;
字符*令牌;
printf(“输入电子邮件=”);
获取(电子邮件);
长度=strlen(电子邮件);

对于(i=0;i假设格式总是第一位的。last@host...,请使用以下代码:

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

int main()
{
    char email[40], first[20],last[20],host[30],name[40];
    int firstDot,atSymbol;
    int i;
    int length;
    char *token;

    printf("Enter the email= ");
    gets(email);
    length = strlen(email);
    for(i=0;i<length;i++){

        if(email[i]=='.')
        {
            firstDot = i;
        }
        else if(email[i]=='@')
        {
            atSymbol = i;
        }
    }
    strncpy(name,email,atSymbol);
    name[atSymbol]= '\0';
       token = strtok(name, ".");

       /* walk through other tokens */
       while( token != NULL ) 
       {
          printf( "%s\n", token );
          token = strtok(NULL, ".");
       }
       strncpy(host,email+atSymbol,length-atSymbol);
    host[length-atSymbol] = '\0';
    puts(host);
}
#包括
#包括
int main()
{
char email[40],first[20],last[20],host[30],name[40];
int firstDot,atSymbol;
int i;
整数长度;
字符*令牌;
printf(“输入电子邮件=”);
获取(电子邮件);
长度=strlen(电子邮件);

对于(i=0;我能在这里发布您的输出吗?知道这些“奇怪的形状”可能会有很大帮助。此外,您应该检查
get
get
的返回值,以防它在不读取任何字符的情况下找到EOF,返回一个
NULL
指针。(事实上,你根本不应该使用
gets
gets
不能保护你免受缓冲区溢出)那么除了gets之外,我应该使用什么呢你应该使用
stdin
作为
参数。这样你可以限制你读取的字节数。你能在这里发布你的输出吗?知道这些“奇怪的形状”是什么吗可能会有很大帮助。此外,您应该检查
gets
gets
的返回值,以防它在未读取任何字符的情况下找到EOF(事实上,您根本不应该使用
gets
gets
不会保护您免受缓冲区溢出)那么除了gets之外我应该使用什么呢?你应该使用
stdin
作为
stream
参数。这样你可以限制你读取的字节数。嗨,刚刚注意到你没有接受我的答案。你有什么问题吗?没有,因为我只能选择一个答案。嗨,刚刚注意到你没有接受我的答案。你有什么问题吗?没有,因为我只能选择一个答案。工作正常。但我无法理解上次while循环。我理解strncy(名称、电子邮件、atsymbol)部分。但接下来会发生什么,我无法理解。请阅读strok的文档:工作正常。但我无法理解上次while循环。我理解strncy(名称、电子邮件、atsymbol)部分。但接下来会发生什么,我无法理解。请阅读strtok的文档: