为什么我的字符串不存储任何东西?

时间:2014-11-16 15:07:29

标签: c string char store scanf

int _tmain(int argc, _TCHAR* argv[])
{
char string1[20], append_string[40];
char *string2 = "APPENDED"; /* string to be appended */

/* prompt for string 1 */
printf("Enter string1: ");
scanf_s("%s", &string1);
while (!strcmp(string1, "done") == 0)
{
    printf("Before append. \nString1: %s \nString2: %s\n\n", string1, string2);
    mystrappend(string1, string2, append_string);
    printf("After append. \nString1: %s \nString2: %s \nAppended string: %s\n\n", string1,            string2, append_string);

    // prompt for string 1 
    printf("Enter string1: ");
    scanf_s("%s", &string1);
   }

 return 0;
 }

输入后为什么String1不存储任何东西? 我有stdio.hconio.hstring.hstdafx.h的头文件。

1 个答案:

答案 0 :(得分:0)

引自the documentation of scanf_s

  

<强>说明:

     

[...]

     

scanfwscanf不同,scanf_swscanf_s要求为c类型的所有输入参数指定缓冲区大小,{{1} },CsS中包含的字符串控件集。字符的缓冲区大小作为附加参数传递,紧跟在指向缓冲区或变量的指针之后。

所以,[]

scanf_s

错误是因为两个原因:

  1. scanf_s("%s", &string1); 需要%s,但您提供的参数char*类型为&string1。这会导致未定义的行为。
  2. 如上面的引文所示,您需要传递表示缓冲区大小的第三个参数。
  3. 使用char(*)[20]代替string1修复问题#1。 &string1将会'衰变'#34;指向其第一个元素(string1)的指针。

    使用char*sizeof使用表示缓冲区大小的第三个参数修复问题#2。

    解决这些问题后,您的_countof应该是

    scanf_s

    scanf_s("%s", string1, sizeof(string1));