4

可能重复:
从输入中读取带有空格字符的字符串?

我在将字符串(技术上的字符数组)作为输入时遇到问题。假设我有以下声明:

 char* s;

我必须使用这个字符指针输入一个字符串,直到我点击“输入”,请帮忙!提前谢谢。

4

6 回答 6

9

在 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
于 2012-12-24T15:06:05.410 回答
2

首先是将输入输入到这个字符串中,你必须分配内存。之后,您可以使用 get 或 fgets 或 scanf

于 2012-12-24T14:49:57.793 回答
1

您可以使用 cin>>variable_name; 如果输入没有空格。对于带空格的输入,在 c++ 中使用gets(variable_name)

于 2012-12-24T15:21:07.297 回答
1

如果您考虑 C++,cin.getline()可能会有用。

于 2012-12-24T14:53:13.650 回答
0

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
于 2012-12-24T15:47:18.960 回答
-1

嗯,因为OP已经声明:

我必须使用这个 char 指针输入一个字符串,直到我点击“enter”

我想我会试一试,这是一个动态缓冲区,使用mallocrealloc使用指针。但是,它可能包含错误,但要点就在那里!挑剔的一边...

抱歉,如果代码确实看起来很糟糕... ::)

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!
于 2012-12-24T15:32:35.260 回答