2

大家好,我仍然对指针感到困惑,我想知道是否有任何方法可以在不必使用 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*).
    无论如何我可以把它变成一个指针吗?他们仍然让我很困惑..而且我对编程一般只是低级语言的新手......

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

    char ie[30] = ""
    
  • 也让我知道是否有更简单的方法来做

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

提前谢谢你stackoverflow:X

4

5 回答 5

2

(1)您的代码中可能存在一个错误:

您正在评论一些将字符串放入 a 的代码,我认为您没有将任何字符串分配给b. 所以默认情况下char b[100];有垃圾值(可能不存在\0b。但字符串连接函数要求它b必须是一个字符串。所以

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

(2)一种初始化空字符串的技术:

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

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

注意:半初始化数组的剩余元素将为0(null),初始化变量假设是一种好习惯

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

要将单词中的字符串连接a[i]b您可以执行以下操作:

strcat(b, a + i);

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

注意:a[i](a + i)不一样,a[i]是 char 类型,其中 as(a + i)是 . 类型的字符串a

假设您有以下字符串数组a并且值为i2 则:

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

所以在上图中avalues is201和 type is char [100](假设数组大小为 100) 也指向一个来自at地址(a + i) 的字符串。然而'e' 203a[i] = 'e'

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

此外,从@BenVoigt 到从th 位置连接n字符,您可以这样做: ai

strncat(b, a+i, n);

n它会将char 从附加a+ib

于 2013-04-10T03:52:05.867 回答
1

由于您想获取一个长度a正好为一个字符的子字符串:

strncat(b, a+i, 1);
于 2013-04-10T03:57:21.903 回答
0

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

您正在附加到垃圾字符数组。

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

现在 strcat() 函数可以正常运行。

于 2013-04-10T03:53:59.720 回答
0

有许多可能的方法来做你想做的事。有一些方法可以完全避免使用strcat()and 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,则需要索引 (i和),或者您可以在第一个版本中多次增加每个循环中j的指针,并且您需要确保不会溢出边界bpb

于 2013-04-10T03:54:43.037 回答
0

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

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

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.

现在,什么是字符串?

于 2013-04-10T04:05:13.047 回答