使用strcat将字符附加到C中的字符串

时间:2013-04-10 03:45:28

标签: c++ c

嗨,大家好我仍然对指针感到困惑,我想知道是否有必要在不使用sprintf的情况下执行以下操作:

char a[100], b[100], c[2];

//Some code that puts a string into a 

for(i = 0; i<strlen(a); i++)
{
    if(a[i] == 'C')
        strcat(b, "b");
    else if(a[i] == 'O')
        strcat(b, "a");
    else if(a[i] == 'D')
        strcat(b, "1");
    else
    {
        sprintf(c, "%s", a[i]);
        strcat(b, c);
    }
}

几乎是for循环遍历字符串(数组)并用字符(或字符串)填充另一个字符串,具体取决于字符是什么,如果字符不是C,O或D它只是添加它到另一个字符串。

  • 我似乎无法strcat(b, a[i]);,我理解它无效,因为它会尝试strcat(char *, char)而不是char*, const char*)无论如何我可以把它变成一个指针吗?他们仍然让我很困惑......而且我对初级编程只是为了低级语言...

  • 还有什么初始化char[] s?的最佳方法,它将填充一个字符串,我现在使用的是:

    char ie[30] = ""
    
  • 另请告知我是否有更简单的方法来执行

我想要抱歉,如果不清楚这显然是一个一次性的脚本,但我的脚本中使用了相同的概念。

提前感谢stackoverflow:X

5 个答案:

答案 0 :(得分:2)

(1)您的代码中可能包含一个错误:

您正在评论将字符串放入的一些代码,我认为您不会将任何字符串分配给b。因此默认情况下char b[100];具有垃圾值(\0中可能不会显示b)。但字符串连接函数期望b必须是一个字符串。所以

strcat(b, "b");   <--will Undefined Behavior 

(2)初始化空字符串的技巧:

是的,您应该始终使用默认值初始化变量(数组),如:

char a[100] = {0}, b[100] = {0}, c[2] = {0};

注意:半初始化数组的其余元素为0(null),初始化variable assume to be good practice

(3)strcat(b, a[i]);错误:

要将单词a[i]上的字符串连接到b,您可以这样做:

strcat(b, a + i);

是的,你是对的strcat(b, a[i]);确实无效。

注意:a[i](a + i)不相同,a[i]是char类型,其中(a + i)a类型的字符串。

假设您有以下字符串数组ai的值为2则为:

+----+----+----+---+---+----+----+----+---+
| 'u'| 's' |'e'|'r'|'5'| '6'| '7'|'8' | 0 |  
+----+----+----+---+---+----+----+----+---+
 201   202  203 204 205 206  207   208 209 210  211
  ^          ^  
  |          |
  a         (a+i) 

因此,在上图中,a值为201,类型为char [100](假设数组大小为100)(a + i)也指向'e'的字符串在地址 203。作为a[i] = 'e'

的地方

所以你不能strcat(b, a[i]);strcat(b, a + i);是有效的语法。

此外,从@BenVoigt到n来自a的{​​{1}}来自i位置,您可以这样做:

strncat(b, a+i, n);

它会将n的{​​{1}}字符附加到a+i

答案 1 :(得分:1)

因为你想要一个a的子字符串只有一个字符长:

strncat(b, a+i, 1);

答案 2 :(得分:0)

将所有char数组初始化为null,以便代码中不存在垃圾值。

你附加了附加的char数组。

char a[100]={0}, b[100]={0}, c[2]={0};

现在strcat()函数表现正常。

答案 3 :(得分:0)

有许多可能的方法可以按照您的意愿去做。有些方法可以避免完全使用strcat()sprintf() - 请参阅下文;您可以在继续使用sprintf()时避免strcat()

我可能会这样做的方法是记录下一个字符要添加到目标字符串b的位置。这将更有效,因为重复使用strcat()涉及二次行为,因为您一次构建一个字符串一个字符。此外,出于同样的原因,通常最好避免在循环条件中使用strlen();它(可能)在每次迭代时进行评估,因此它也会导致二次行为。

char a[100], b[100];
char *bp = b;

//Some code that puts a string into a 
size_t len = strlen(a);

for (int i = 0; i < len; i++, bp++)
{
    if (a[i] == 'C')
        *bp = 'b';
    else if(a[i] == 'O')
        *bp = 'a';
    else if(a[i] == 'D')
        *bp = '1';
    else
        *bp = a[i];
}
*bp = '\0';   // Null-terminate the string

通过使用索引变量i分配给b,您也可以不使用指针(只要您只为输入字符添加一个字符输出):

char a[100], b[100];

//Some code that puts a string into a 
size_t len = strlen(a);

for (int i = 0; i < len; i++)
{
    if (a[i] == 'C')
        b[i] = 'b';
    else if(a[i] == 'O')
        b[i] = 'a';
    else if(a[i] == 'D')
        b[i] = '1';
    else
        b[i] = a[i];
}
b[i] = '\0';   // Null-terminate the string

只要a中的字符串足够短,所显示的代码(任一版本)就不会溢出b。如果您有时向b添加了几个字符,则需要索引(ij),或者您可以在第一个版本中增加指针bp每个循环不止一次,你需要确保不要超出b的范围。

答案 4 :(得分:0)

您似乎对字符串感到困惑。字符串不仅仅是一个数组。你正在读哪本书?

当您第一次致电strcat以对b进行操作时,b不能保证是字符串。结果是未定义的行为。此代码似乎在您的系统上正常运行,但如果确实如此,那就巧合了。我看到这样的代码在其他系统上以奇怪的方式失败了。修复如下:

char a[100], b[100];

//Some code that puts a string into a
a[x] = '\0'; // <--- Null terminator is required for a to contain a "string".
             //      Otherwise, you can't pass a to strlen.

for(i = 0; i<strlen(a); i++)
{
    if(a[i] == 'C')
        b[i] = 'b';
    else if(a[i] == 'O')
        b[i] = 'a';
    else if(a[i] == 'D')
        b[i] = '1';
    else
        b[i] = a[i];
}

b[i] = '\0'; // If you don't put a null character at the end, it isn't a string.

现在,什么是字符串?