嗨,大家好我仍然对指针感到困惑,我想知道是否有必要在不使用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
答案 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
类型的字符串。
假设您有以下字符串数组a
,i
的值为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
添加了几个字符,则需要索引(i
和j
),或者您可以在第一个版本中增加指针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.
现在,什么是字符串?