2

如何在不连接的情况下一个接一个地存储两个字符串(我们可以增加地址)

char str[10];
scanf("%s",str);
str=str+9;
scanf("%s",str);

注意:在这里,如果我将第一个字符串作为 BALA 并将第二个字符串作为 HI,它应该在 BALA 之后打印为 HI。但 HI 不应取代 BALA。

4

4 回答 4

8

您不能像这样增加(或以任何其他方式更改)数组,数组变量 ( 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".

当然,这是非常危险的,并且可能会引入缓冲区溢出,但这正是您想要的。

于 2013-05-13T07:45:27.640 回答
2

如果我理解您想要正确执行的操作,也许您想将字符串放入数组中。所以你的代码的修改版本看起来像

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)

于 2013-05-13T07:51:12.623 回答
0

朝着与展开类似的方向移动,您可以使用该%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;
于 2013-05-13T09:31:12.993 回答
0

可能是你在看这样的东西

    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);
于 2013-05-13T08:14:30.943 回答