如何在不连接的情况下一个接一个地存储两个字符串(我们可以增加地址)
char str[10];
scanf("%s",str);
str=str+9;
scanf("%s",str);
注意:在这里,如果我将第一个字符串作为 BALA 并将第二个字符串作为 HI,它应该在 BALA 之后打印为 HI。但 HI 不应取代 BALA。
您不能像这样增加(或以任何其他方式更改)数组,数组变量 ( str
) 是一个无法更改的常量。
你可以这样做:
char str[64];
scanf("%s", str);
scanf("%s", str + strlen(str));
这将首先扫描到str
,然后立即再次扫描,在第一个字符串终止'\0'
的顶部开始新字符串。
如果您"BALA"
先输入,开头str
将如下所示:
+---+---+---+---+----+
str: | B | A | L | A | \0 |
+---+---+---+---+----+
并且因为strlen("BALA")
是四,下一个字符串将被扫描到缓冲区中,从上面'\0'
可见的顶部开始。如果您然后输入"HI"
,str
将像这样开始:
+---+---+---+---+---+---+----+
str: | B | A | L | A | H | I | \0 |
+---+---+---+---+---+---+----+
此时,如果您打印str
,它将打印为"BALAHI"
.
当然,这是非常危险的,并且可能会引入缓冲区溢出,但这正是您想要的。
如果我理解您想要正确执行的操作,也许您想将字符串放入数组中。所以你的代码的修改版本看起来像
char strings[ARRAY_LENGTH][MAX_STRING_LENGTH];
char* str = strings[0];
scanf("%s",str);
str=strings[1];
scanf("%s",str);
然后要打印所有字符串,您必须像这样遍历数组
int i;
for(i = 0; i < ARRAY_LENGTH; i++)
{
printf(strings[i]);
}
(您必须定义 ARRAY_LENGTH 和 MAX_STRING_LENGTH)
朝着与展开类似的方向移动,您可以使用该%n
指令来确定已读取的字节数。不要忘记减去任何前导空格。您可能还想非常仔细地阅读有关 scanf 的手册,但要特别注意“返回值”部分。处理返回值对于确保实际读取字符串并避免未定义的行为是必要的。
char str[64];
int whitespace_length, str_length, total_length;
/* NOTE: Don't handle errors with assert!
* You should replace this with proper error handling */
assert(scanf(" %n%s%n", &whitespace_length, str, &total_length) == 1);
str_length = total_length - str_length;
assert(scanf(" %n%s%n", &whitespace_length, str + str_length, &total_length) == 1);
str_length += total_length - str_length;
可能是你在看这样的东西
char arr[100] = {0,}, *str = NULL;
/** initial String will be scanned from beginning **/
str = arr;
/** scan first string **/
fgets(str, 100, stdin);
/** We need to replace NULL termination with space is space is delimiter **/
str += strlen(str)-1;
*str = ' ' ;
/** scan second string from address just after space,
we can not over ride the memory though **/
fgets(str, 100 - strlen(str), stdin);
printf("%s",arr);
好吧,如果你需要同样的 scanf
char arr[100] = {0,}, *str = NULL;
/** initial String will be scanned from beginning **/
str = arr;
/** scan first string **/
scanf("%s",str);
/** We need to replace NULL termination with space is space is delimiter **/
str += strlen(str);
*str = ' ' ;
/** scan second string from address just after space,
* we can not over ride the memory though **/
str++;
scanf("%s",str);
printf("%s",arr);