可能重复:
从输入中读取带有空格字符的字符串?
我在将字符串(技术上的字符数组)作为输入时遇到问题。假设我有以下声明:
char* s;
我必须使用这个字符指针输入一个字符串,直到我点击“输入”,请帮忙!提前谢谢。
可能重复:
从输入中读取带有空格字符的字符串?
我在将字符串(技术上的字符数组)作为输入时遇到问题。假设我有以下声明:
char* s;
我必须使用这个字符指针输入一个字符串,直到我点击“输入”,请帮忙!提前谢谢。
在 C 和 C++ 中,您都可以使用该fgets
函数,该函数将字符串读取到新行。例如
char *s=malloc(sizeof(char)*MAX_LEN);
fgets(s, MAX_LEN, stdin);
会做你想做的(在C中)。在 C++ 中,代码类似
char *s=new char[MAX_LEN];
fgets(s, MAX_LEN, stdin);
C++ 也支持std::string
类,它是一个动态的字符序列。有关字符串库的更多信息:http ://www.cplusplus.com/reference/string/string/ 。如果您决定使用字符串,那么您可以通过以下方式读取整行:
std::string s;
std::getline(std::cin, s);
在哪里可以找到:该fgets
过程可以在标题中找到<string.h>
,或者<cstring>
对于 C++。该malloc
函数可以在<stdlib.h>
C 和<cstdlib>
C++ 中找到。最后,在文件中可以找到std::string
带有std::getline
函数的类<string>
。
建议(针对 C++):如果您不确定使用哪一个,C 风格的字符串或std::string
,根据我的经验,我告诉您字符串类更易于使用,它提供更多实用程序,而且速度也快得多比 C 风格的字符串。这是C++ 入门的一部分:
As is happens, on average, the string class implementation executes considerably
faster than the C-style string functions. The relative average execution times on
our more than five-year-old PC are as follows:
user 0.4 # string class
user 2.55 # C-style strings
首先是将输入输入到这个字符串中,你必须分配内存。之后,您可以使用 get 或 fgets 或 scanf
您可以使用 cin>>variable_name; 如果输入没有空格。对于带空格的输入,在 c++ 中使用gets(variable_name)
如果您考虑 C++,cin.getline()
可能会有用。
s
应该在开始填写之前分配
1)如果您事先不知道输入字符串的大小,您可以使用realloc
char* s = calloc(1,sizeof(char));
char t;
int len;
while(scanf("%c", &t)==1)
{
if(t== '\n')
break;
len = strlen(s);
s= realloc(s,len+1);
*(s+len) = t;
*(s+len+1) = '\0';
}
2)现在如果您事先知道输入字符串最大长度的大小,您可以通过以下方式将您的字符串直接读入带有 scanf 的 char 数组:
char s[256] // Let's assume that the max length of your input string is 256
scanf("%[^\r\n]",s) // this will read your input characters till you heat enter even if your string contains spaces
嗯,因为OP已经声明:
我必须使用这个 char 指针输入一个字符串,直到我点击“enter”
我想我会试一试,这是一个动态缓冲区,使用malloc
和realloc
使用指针。但是,它可能包含错误,但要点就在那里!挑剔的一边...
抱歉,如果代码确实看起来很糟糕... ::)
char *ptr = NULL, *temp_ptr = NULL;
int c = 0, chcount = 0, enter_pressed = 0;
do{
c = fgetc(stdin);
if (c != '\n' || c != -1){
chcount++;
if (ptr == NULL){
ptr = malloc(sizeof(char) + chcount + 1);
if (ptr != NULL) ptr[chcount] = c;
else printf("ABORT!\n");
}else{
temp_ptr = realloc(ptr, chcount + 1);
if (temp_ptr != NULL){
ptr = temp_ptr;
ptr[chcount] = c;
}else{
// OK! Out of memory issue, how is that handled?
break;
}
}
}else{
enter_pressed = 1;
}
}while (!enter_pressed);
ptr[chcount] = '\0'; // nul terminate it!