繁体   English   中英

从带有空格的字符串中提取两个字符串

[英]Extract two string from a string with a space

让我们假设

char nickAndPwd[] = "John 1234";

我想得到nick ="John"password = "1234"我该怎么做?

这就是我所做的,但似乎无法正常工作

int main() {  

  char nicknameAndPwd[] = "Alessandro 12345678901";
  char nick[10];
  char pwd[11];

  int nickLength = 10;
  int pwdLength = 11;

  memcpy( nick, &nicknameAndPwd[0], nickLength);
  nick[nickLength] = '\0';

  memcpy(pwd, &nicknameAndPwd[nickLength+1], pwdLength);
  pwd[pwdLength] = '\0';

  printf("%s\n", nick);
  printf("%s\n", pwd);

  return 0;
}

我该如何解决?

如果你不知道名字和密码的准确长度,你应该尝试这样的事情。

/**
  gcc -std=c99 -o prog_c prog_c.c \
      -pedantic -Wall -Wextra -Wconversion \
      -Wc++-compat -Wwrite-strings -Wold-style-definition -Wvla \
      -g -O0 -UNDEBUG -fsanitize=address,undefined
**/

#include <stdio.h>

void
test_function(const char *nicknameAndPwd)
{
  printf("testing with <%s>\n", nicknameAndPwd);
  char nick[11]; // assume no more than 10 useful chars
  char pwd[12]; // assume no more than 11 useful chars
  if(sscanf(nicknameAndPwd, "%10s %11s", nick, pwd)==2)
  {
    nick[10]='\0'; // ensure string termination if input was too long
    pwd[11]='\0'; // ensure string termination if input was too long
    printf("  nick <%s>\n", nick);
    printf("  pwd <%s>\n", pwd);
  }
}

int
main(void)
{
  test_function("Alessandro 12345678901");
  test_function("Shorter 1234567");
  test_function("NowItIsLonger 1234567");
  return 0;
}

将您的代码更改为:

  nick[nickLength-1] = '\0';
  pwd[pwdLength-1] = '\0';

nickpwd的分配范围都是[0,size-1]

用空格分割字符串的更通用方法可能是:

#include<string.h>
#include<stdio.h>
int main() {  

  char nicknameAndPwd[50];
  char *p;
  fgets(nicknameAndPwd,50,stdin);
  if (p=strchr(nicknameAndPwd,'\n')) *p='\0';
  p = strchr(nicknameAndPwd,' ');
  char nick[25];
  char *pswd;
  strncpy(nick,nicknameAndPwd,p-nicknameAndPwd);
  pswd = nicknameAndPwd+(p-nicknameAndPwd)+1;
  puts(nick);
  puts(pswd);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM