[英]How to correctly extract a string from a user space pointer in kernel space?
[英]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';
nick
和pwd
的分配范围都是[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.