下面是一个例子:`
#include <stdio.h>
#include <string.h>
int main()
{
char s1[] = "abcd", c;
scanf("%c", c);
char* pToC = strchr(s1, c);
if (pToC)
{
if (*(pToC - 1) == a)
{
printf("%c", c);
{
}
return 0;
}
'在这种情况下,如果我输入“a”会发生什么?我的程序中也有类似的情况,我正在考虑会发生什么。在我的程序中,我必须检查strstr()找到的单词前面是否有空格,但strstr()的结果也可能指向字符串的第一个字符。
我期望它只在我输入“B”的时候才能工作。
编辑:由于注解有最大字符数限制,我将把确切的代码放在这里
#include <stdio.h>
#include <memory>
char* WordReplace(char* input, const char* word, const char* replacement)//EXERCISE 13
{
if (input == 0 || *input == 0 || word == 0 || *word == 0 || replacement == 0 || *replacement == 0)
{
return 0;
}
int inputLength = strlen(input), wordLength = strlen(word), replacementLength = strlen(replacement);
char* buffer = input;
while (strstr(buffer, word))
{
char* firstChar = strstr(buffer, word), * nextChar = strstr(buffer, word) + wordLength;
if ((firstChar == input && *nextChar == ' ') ||
(firstChar == input && *nextChar == 0) ||
(*(firstChar - 1) == ' ' && *nextChar == ' ') ||
(*(firstChar - 1) == ' ' && *nextChar == 0))
{
buffer = strstr(buffer, word);
char* output = (char*)malloc(sizeof(char) * (inputLength - wordLength + replacementLength + 1));
memmove(output, input, sizeof(char) * (buffer - input));
if (buffer != input)
{
output[buffer - input - 1] = ' ';
}
output[buffer - input] = 0;
strcat(output, replacement);
strcat(output, buffer + wordLength);
return output;
}
buffer = strstr(buffer, word) + 1;
}
return 0;
}
int main()
{
char thirteenInput[] = "My name is Karl", thirteenWord[] = "My", thirteenReplacement[] = "Your";//INPUT
printf("WordReplace\n%s, %s, %s\n", thirteenInput, thirteenWord, thirteenReplacement);
char* thirteenOutput = WordReplace(thirteenInput, thirteenWord, thirteenReplacement);
if (thirteenOutput)
{
printf("%s\n\n", thirteenOutput);
free(thirteenOutput);
}
else
{
printf("Word was not found / input error!\n\n");
}
return 0;
}
1条答案
按热度按时间uemypmqf1#
如果
array
被定义为一个数组,并且某些特殊情况不适用,则访问array[-1]
不是由C标准定义的。如果程序甚至试图计算地址array - 1
,则该行为不是由C标准定义的。当一个数组用订阅表示法访问时,如
array[i]
,C 2018 6.5.2.1 2将其定义为等价于(*((array) + (i)))
,然后6.5.6 8用一个数组和一个整数定义+
:...如果指针操作数和结果都指向同一数组对象的元素,或者指向数组对象最后一个元素之后的元素,则求值不会产生溢出;否则,行为未定义...
因为索引为-1的元素既不是数组中的元素,也不是最后一个元素之后的元素(正向;此处不包括第一元素之前的元素),则行为未定义。
即使你知道数组在内存中的位置,也知道数组前面的数据是什么,但这并不意味着索引为-1的数组访问是安全的,也不意味着它会访问数组前面的数据。因为C语言标准没有定义这种行为,所以编译器在优化过程中可能会以你意想不到的方式转换程序。使得阵列访问产生不同于访问先前存储器的行为。
注意
作为一个特殊情况的例子,如果我们有一个
char
指针p
指向一个包含数组的结构,我们可以用p
进行地址运算,只要结果仍然在结构内或超过它的最后一个字节,即使p
指向数组,但加法产生的结果在数组之前。