我使用的变量数量有限,所以我想仅使用一个变量来解决以下问题。有可能吗?
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数组的开头。这有什么简单的解决方案吗?
答案 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]);