C字符串输入混乱

时间:2010-04-06 20:12:28

标签: c string pointers

C真的不是我的强项,在阅读了一本关于这个主题的书的三章之后,花了很多年的时间试图让它们起作用它就没有了:

#include <stdio.h>
char *a,*b;
int main( )
{
     char input[10];
     fgets(input,sizeof input, stdin);
     a = input;
     fgets(input,sizeof input, stdin);
     b = input;
     printf("%s : %s",a,b);

}

我已从主要项目中分离出问题。此代码用于读取两个字符串然后打印它们,但它似乎是设置a和b指向输入。输入A和B时此代码的输出样本是(不要担心\ n我可以删除它们):

A
B
B
 : B

如何将输入值存储在另一个变量中,例如。 a或b,以便在上述情况下

A
B
A
 : B

输出?

注意:我不希望a或b指向另一个我希望在其中存储字符串的变量:

a = "A";
b = "B";

将是字符串文字等效。

由于

4 个答案:

答案 0 :(得分:4)

您必须将ab声明为与输入数组一样大的单独数组,或者为它们动态分配内存。无论哪种方式,您都必须使用strcpy()将一个字符串的内容复制到另一个字符串:

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

int main(void)
{
  char input[10], a[10], b[10];
  fgets(input, sizeof input, stdin);
  strcpy(a, input);
  fgets(input, sizeof input, stdin);
  strcpy(b, input);
  printf("%s : %s\n", a, b);
  return 0;
}

答案 1 :(得分:2)

a是指向输入的指针,b是。设置a = input只是将a设置为指向输入。

因此,您对fgets的调用会影响同一个缓冲区。

您应该为A和B使用两个单独的数组,并将数据从输入复制到A和B.

  

注意:我不希望a或b指向另一个我希望在其中存储字符串的变量:

     

a =“A”;

     

b =“B”;

     

将是字符串文字等效。

不幸的是,C并不像你想象的那样工作。你已经习惯了为你做复制的高级语言。

在C中,如果您希望A和B包含数据,则必须指定数据容器,并在其中放置数据。

例如:

int main( ) 
{ 
     char input[10]; 
     char aData[10];
     char bData[10];     
     fgets(input,sizeof input, stdin); 
     strcpy(aData, input);
     fgets(input,sizeof input, stdin); 
     strcpy(bData, input);
     printf("%s : %s",aData,bData);  
}

答案 2 :(得分:1)

使用2个不同的char缓冲区数组。

指针只是一个保存内存地址的变量。

所以在下面的代码中:

a = input;

b = input;

ab都拥有相同的内存地址,该内存地址是数组第一个元素的地址。

这是正确的代码:

char input1[10];
char input2[10];
fgets(input,sizeof input1, stdin);
fgets(input,sizeof input2, stdin);
printf("%s : %s",input1, input2);

另外,当您使用sizeof(pointer)时,您将始终在x86系统上获得4。你没有得到你指向的元素的大小。

答案 3 :(得分:1)

您需要为每个输入使用单独的数组,因此第二个输入不会覆盖第一个。

#include <stdio.h>
int main( )
{
     char a[10];
     char b[10];
     fgets(a,sizeof a, stdin);
     fgets(b,sizeof b, stdin);
     printf("%s : %s",a,b);

}