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