' scanf的'对于一个字符串 - 程序崩溃?

时间:2015-04-27 14:20:56

标签: c string scanf

输入字符串时为什么会崩溃?我不认为我正在读正确的字符串,但该程序在第一次扫描时给出了错误。'该程序应该是正确的,但这是C而不是C ++。我能找到的大多数帮助都是针对C ++的。

//Andrei Shulgach
//April 27th, 2015
/*A string is a palindrome if it can be read forward and backward with the same 
meaning. Capitalizations and spacing are ignored.*/

#include <stdio.h>
#include <stdlib.h>

int newStrCmp (const char *string1, const char *string2);

int main()
{
    //Local Declarations
    int dummy, value;
    char string1[100],string2[100];

    printf("Please enter the 1st string: ");
    scanf_s("%99s", string1[100]);
    printf("\nPlease enter the 2nd string: ");
    scanf_s("%99s", string2[100]);

    //Call Function and get value
    value = newStrCmp(string1, string2);

    if (value == 0)
        printf("The strings are equal.\n");
    else
        printf("The strings are not equal.\n");

    scanf_s("%d",&dummy);//Keep Window Open
    return 0;
}

int newStrCmp (const char *string1, const char *string2)
{
    //Local Declarations
    int value = 0;

    while (string1[value] == string2[value]) 
    {
      if (string1[value] == '\0' || string2[value] == '\0')
         break;
         value++;
   }

   if (string1[value] == '\0' && string2[value] == '\0')
      return 0;
   else
      return -1;
}

2 个答案:

答案 0 :(得分:1)

您必须启用可以从编译器获得的所有编译器警告;上面的代码不应该编译。

此:

scanf_s("%99s", string1[100]);

调用未定义的行为,因为它将外部索引为100个字符的string1数组。请记住,C数组的索引是0.它也不符合scanf_s()要求为所有字符串转换指定大小的要求。

然后 1 导致更多未定义的行为,当scanf_f()单个字符解释为缓冲区地址时输入为存储(假设呼叫正在发生)。

这不是有效的代码。

它应该只是传递数组中第一个字符的地址:

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

此处string1&string1[0]相同;数组的名称在许多上下文中计算其第一个元素的地址。然后我们使用sizeof string1作为第三个参数来指定string1缓冲区的大小,即required

1 你无法推断在未定义的行为发生任何确定之后会发生什么。

答案 1 :(得分:0)

问题是你'扫描'到长度为100的缓冲区的索引100,即越界。

scanf_s("%99s", string1);

此外,您的比较将更安全,因为for循环可确保值小于100,而不是while循环。 将来,请包含错误消息。