Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
';Scanf&x27;字符串程序崩溃?_C_String_Scanf - Fatal编程技术网

';Scanf&x27;字符串程序崩溃?

';Scanf&x27;字符串程序崩溃?,c,string,scanf,C,String,Scanf,为什么输入字符串时会崩溃?我不认为我在字符串中正确阅读,但是程序在第一个“扫描”上给了我一个错误。程序应该是正确的,但是这不是C++。我能找到的大部分帮助是C++。p> //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 ignore

为什么输入字符串时会崩溃?我不认为我在字符串中正确阅读,但是程序在第一个“扫描”上给了我一个错误。程序应该是正确的,但是这不是C++。我能找到的大部分帮助是C++。p>
//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;
}
//Andrei Shulgach
//2015年4月27日
/*如果字符串可以用相同的字符前后读取,那么它就是回文
意思忽略大写和间距*/
#包括
#包括
int newStrCmp(常量字符*string1,常量字符*string2);
int main()
{
//本地声明
int虚拟值;
字符string1[100],string2[100];
printf(“请输入第一个字符串:”);
scanf_s(“%99s”,string1[100]);
printf(“\n请输入第二个字符串:”);
扫描频率(“%99s”,string2[100]);
//调用函数并获取值
值=newStrCmp(string1,string2);
如果(值==0)
printf(“字符串相等。\n”);
其他的
printf(“字符串不相等。\n”);
scanf_s(“%d”,&dummy);//保持窗口打开
返回0;
}
int newStrCmp(常量字符*string1,常量字符*string2)
{
//本地声明
int值=0;
而(string1[value]==string2[value])
{
if(string1[值]='\0'| | string2[值]='\0')
打破
值++;
}
if(string1[value]=='\0'&&string2[value]=='\0')
返回0;
其他的
返回-1;
}

问题是您正在“扫描”长度为100缓冲区的索引100,即超出范围

scanf_s("%99s", string1);
此外,作为确保值小于100的for循环,您的比较将比while循环更安全。
以后,请包含错误消息

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

这:

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

scanf\u f()
将单个字符解释为存储输入的缓冲区地址时(当然,假设调用发生),它可能会导致更多未定义的行为

这是无效的代码

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

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


1您无法对未定义的行为发生后发生的情况进行任何确定的推理。

该修复程序不起作用,错误消息只是“程序停止工作…”对不起。尝试不使用&symbol。那么我应该怎么做才能修复它,使其解释多个字符?这不起作用
scanf_s
需要第三个参数来表示缓冲区的大小。见,备注,第4页paragraph@CoolGuy哦。谢谢,我不太熟悉Windows的特定功能。我希望已经修好了。
scanf_s("%99s", string1, sizeof string1);