输入字符串时为什么会崩溃?我不认为我正在读正确的字符串,但该程序在第一次扫描时给出了错误。'该程序应该是正确的,但这是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;
}
答案 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循环。 将来,请包含错误消息。