我对C非常陌生,我想制作一个简单的程序,从值中获取字符串的索引,一旦有了索引,它就会将其从字符串中删除。它导致缓冲区溢出错误?很确定它是从strcat从网上搜索,但我不确定。感谢您的帮助!另外,请不要在你的答案中使用*,因为我不知道它们是如何工作的,我很快就会学会的。(如果你的答案需要它,请解释你如何在代码中使用它(
代码在这里:
#include <string.h>
int findIndex(char string[], char substr) {
for (int index = 0; index < strlen(string); index++) {
if (string[index] == substr) {
return index;
}
}
return -1;
}
int main(void) {
char howAreYou[9] = "howAreYou";
char newString[9];
int index = findIndex(howAreYou, 'o');
for (int i = 0; i < 8; i++) {
if (i != index) {
strncat(newString, &howAreYou[i], 1);
}
}
printf("new string: %s", newString);
return 0;
}
一个简单的解决方案是生成一个函数,从字符串中删除所需的字符。但请确保在字符串的最后添加"\0"(空字符(。
当你从字符串中删除一个字符时,它的长度应该减少一个,因为该位置之后的所有字符都将移动到左一个位置所以不需要最后一个字符
#include <string.h>
#include <stdio.h>
int findIndex(char string[], char substr)
{
for (int index = 0; index < strlen(string); index++)
{
if (string[index] == substr)
{
return index;
}
}
return -1;
}
// This function removes the desired character from the char array
void removeChar(char string[], int index)
{
for (int i = index + 1; i < strlen(string); i++)
{
string[i - 1] = string[i];
}
// Making the last character ' ' (null character) so that string can end here
string[strlen(string) - 1] = ' ';
}
int main(void)
{
char howAreYou[9] = "howAreYou";
int index = findIndex(howAreYou, 'o');
removeChar(howAreYou, index);
printf("new string: %s", howAreYou);
return 0;
}
希望它能有所帮助!:(
对于初学者,您忘记包含标题<stdio.h>
最好像一样定义阵列howAreYou
char howAreYou[] = "howAreYou";
而不是
char howAreYou[9] = "howAreYou";
否则数组不包含字符串。
相应地,数组newString
应该像一样声明
char newString[sizeof( howAreYou )];
数组newString
不包含字符串。因此,函数strncat
的调用调用了未定义的行为。
此外,通常还需要检查函数findIndex
的返回值。
由于您已经在使用标准C字符串函数,并且只想删除字母'o'
的第一个出现,因此可以简单地使用标准C函数strchr
来完成。
使用函数strncpy
存储一个字符既愚蠢又低效。
例如
const char *p = strchr( howAreYou, 'o' );
if ( p == NULL )
{
strcpy( newString, howAreYou );
}
else
{
size_t n = p - howAreYou;
strncpy( newString, howAreYou, n );
strcpy( newString + n, p + 1 );
}
这是一个示范节目。
#include <stdio.h>
#include <string.h>
int main( void )
{
char howAreYou[] = "howAreYou";
char newString[sizeof( howAreYou )];
const char *p = strchr( howAreYou, 'o' );
if (p == NULL)
{
strcpy( newString, howAreYou );
}
else
{
size_t n = p - howAreYou;
strncpy( newString, howAreYou, n );
strcpy( newString + n, p + 1 );
}
puts( newString );
}
程序输出为
hwAreYou
如果你想使用自己的功能findIndex
,那么程序可以按照以下方式
#include <stdio.h>
#include <string.h>
size_t findIndex( const char string[], char c )
{
size_t i = 0;
while (string[i] != ' ' && string[i] != c) ++i;
return string[i] == ' ' ? -1 : i;
}
int main( void )
{
char howAreYou[] = "howAreYou";
char newString[sizeof( howAreYou )];
size_t n = findIndex( howAreYou, 'o' );
if ( n == ( size_t )-1 )
{
strcpy( newString, howAreYou );
}
else
{
strncpy( newString, howAreYou, n );
strcpy( newString + n, howAreYou + n + 1 );
}
puts( newString );
}
使用char howAreYou[] = "howAreYou";
允许终止零
使用char newString[sizeof howAreYou] = "";
使数组具有正确的大小,并初始化数组,使其在串联之前为空。
#include <stdio.h>
#include <string.h>
int findIndex(char string[], char substr) {
for (int index = 0; string[index]; index++) {
if (string[index] == substr) {
return index;
}
}
return -1;
}
int main(void) {
char howAreYou[] = "howAreYou";
char newString[sizeof howAreYou] = "";
int index = findIndex(howAreYou, 'o');
for (int i = 0; i < sizeof howAreYou; i++) {
if (i != index) {
strncat(newString, &howAreYou[i], 1);
}
}
printf("new string: %sn", newString);
return 0;
}