准确地将三个单词读入一个char数组

时间:2013-08-03 09:45:52

标签: c

我使用的变量数量有限,所以我想仅使用一个变量来解决以下问题。有可能吗?

  char str[100];
  // Type three words:
  printf("Type three words: ");
  scanf("%s %s %s",str,str,str);
  printf("You typed in the following words: \"%s\", \"%s\" and \"%s\"\n",str,str,str);

以下输入提供以下输出:

Type three words: car cat cycle
You typed in the following words: "cycle", "cycle" and "cycle"

这并不奇怪,因为最后一个读取的单词存储在同一个char数组的开头。这有什么简单的解决方案吗?

7 个答案:

答案 0 :(得分:3)

使用循环?

char buf[0x100];

for (int i = 0; i < 3; i++) {
    scanf("%s", buf);
    printf("%s ", buf);
}

旁注:但为什么不立刻读完整行,然后用e解析。 G。 strtok_r()

fgets(buf, sizeof buf, stdin);

是要走的路......

答案 1 :(得分:2)

您正在将每个单词分配到缓冲区的相同地址,因此它们将首先被汽车覆盖,然后通过cat覆盖,最后循环覆盖。

尝试使用2D数组,一个维度是它包含的单词,另一个是它将保留多少个字符,21个用于20个字符和一个零终止。

char str[3][21];
// Type three words:
printf("Type three words: ");
scanf("%s %s %s",str[0],str[1],str[2]);
printf("You typed in the following words: \"%20s\", \"%20s\" and \"%20s\"\n",str[0],str[1],str[2]);

此代码不会读取超过20行的字,从而防止溢出缓冲区和内存访问冲突。 scanf格式字符串%20s将读数限制为20个字符。

答案 2 :(得分:1)

如果你知道单词可以有多长,你可以这样做:

scanf("%s %s %s",str,&str[30],&str[70]);

并通过以下方式显示:

printf("You typed in the following words: \"%s\", \"%s\" and \"%s\"\n",str,str[30],str[70]);

但它不是很优雅和安全。

答案 3 :(得分:1)

这是最糟糕的方式,但仍然:

只使用输入字符串的随机大小

char str[100];
  // Type three words:
  printf("Type three words: ");
  scanf("%s %s %s",str,str+22,str+33);
  printf("You typed in the following words: 
          \"%s\", \"%s\" and \"%s\"\n",str,str+22,str+33);

答案 4 :(得分:0)

你说你只能使用一个变量。而不是使一个变量成为单个字符串(char数组),使其成为字符串数组(char的二维数组)。

答案 5 :(得分:0)

如果输入名称保证字母小于某个数字,如9,则可以使用:

printf("Type three words: ");
scanf("%s %s %s",str,str + 10,str + 20);
printf("You typed in the following words: \"%s\", \"%s\" and \"%s\"\n",str, str + 10, str + 20);

答案 6 :(得分:0)

您可以使用二维数组:

char str[3][30];

printf("Type three words: ");
scanf("%s %s %s", str[0], str[1], str[2]);

printf("You typed in the following words: \"%s\" \"%s\" \"%s\"\n", str[0], str[1], str[2]);