avatar
问一道 C/C++ 题# JobHunting - 待字闺中
a*r
1
哪位大侠能帮我看看下面的code 哪些地方错了?多谢了!为方便,我写了行号
TCHAR* ToUpper(TCHAR *input) { // 1
static TCHAR buffer[1000]; // 2
TCHAR *p = input; // 3
TCHAR *q = buffer; // 4
// 5
while (*p != '\0') { // 6
*q = *p + 'A' - 'a'; // 7
p++; // 8
q++; // 9
} // 10
return buffer; // 11
} // 12
avatar
v*u
2
line 7 is only needed for lower case characters.
You don't need it for others

【在 a********r 的大作中提到】
: 哪位大侠能帮我看看下面的code 哪些地方错了?多谢了!为方便,我写了行号
: TCHAR* ToUpper(TCHAR *input) { // 1
: static TCHAR buffer[1000]; // 2
: TCHAR *p = input; // 3
: TCHAR *q = buffer; // 4
: // 5
: while (*p != '\0') { // 6
: *q = *p + 'A' - 'a'; // 7
: p++; // 8
: q++; // 9

avatar
c*o
3
是不是buffer要分配内存?

【在 a********r 的大作中提到】
: 哪位大侠能帮我看看下面的code 哪些地方错了?多谢了!为方便,我写了行号
: TCHAR* ToUpper(TCHAR *input) { // 1
: static TCHAR buffer[1000]; // 2
: TCHAR *p = input; // 3
: TCHAR *q = buffer; // 4
: // 5
: while (*p != '\0') { // 6
: *q = *p + 'A' - 'a'; // 7
: p++; // 8
: q++; // 9

avatar
S*I
4
There is no syntax error, but there are several problems with this function:
1. buffer is declared as static
2. if the input contains capital character or non-letter character, line 7
does not work correctly
3. after the while loop, the terminal character '\0' is not added to the end
of q

【在 a********r 的大作中提到】
: 哪位大侠能帮我看看下面的code 哪些地方错了?多谢了!为方便,我写了行号
: TCHAR* ToUpper(TCHAR *input) { // 1
: static TCHAR buffer[1000]; // 2
: TCHAR *p = input; // 3
: TCHAR *q = buffer; // 4
: // 5
: while (*p != '\0') { // 6
: *q = *p + 'A' - 'a'; // 7
: p++; // 8
: q++; // 9

avatar
S*I
5
no

【在 c******o 的大作中提到】
: 是不是buffer要分配内存?
avatar
a*r
6
我run了这个程序,buffer 用了 static 就行,不知为啥。总觉得用static怪怪的, 但
不知为啥不好。

【在 c******o 的大作中提到】
: 是不是buffer要分配内存?
avatar
c*o
7
第3条,char array的初始化是不是都是‘\0’?那样就不用加了。

function:
end

【在 S**I 的大作中提到】
: There is no syntax error, but there are several problems with this function:
: 1. buffer is declared as static
: 2. if the input contains capital character or non-letter character, line 7
: does not work correctly
: 3. after the while loop, the terminal character '\0' is not added to the end
: of q

avatar
c*o
8
The elements of global and static arrays, on the other hand, are
automatically initialized with their default values, which for all
fundamental types this means they are filled with zeros.

【在 a********r 的大作中提到】
: 我run了这个程序,buffer 用了 static 就行,不知为啥。总觉得用static怪怪的, 但
: 不知为啥不好。

avatar
S*I
9
try the following:
char *s1 = "firststring";
char *s2 = "secondstring";
char *t1 = ToUpper(s1);
char *t2 = ToUpper(s2);
printf("%s\n", t1);
printf("%s\n", t2);

【在 a********r 的大作中提到】
: 我run了这个程序,buffer 用了 static 就行,不知为啥。总觉得用static怪怪的, 但
: 不知为啥不好。

avatar
c*o
10
如果不加static,就要SETI说的第3条。

【在 c******o 的大作中提到】
: The elements of global and static arrays, on the other hand, are
: automatically initialized with their default values, which for all
: fundamental types this means they are filled with zeros.

avatar
f*t
11
static buffer可能不是thread-safe吧?如果单线程运行并调用次数很多,用static
buffer应该能增加性能,还不用担心程序写的不好导致内存泄露。
主要问题就是4楼说的2、3两点了。
avatar
S*I
12
单线程也是错的,buffer是一个全局变量,如果对不止一个字符串调用这个函数,所有
返回的字符串都会指向buffer。

【在 f*******t 的大作中提到】
: static buffer可能不是thread-safe吧?如果单线程运行并调用次数很多,用static
: buffer应该能增加性能,还不用担心程序写的不好导致内存泄露。
: 主要问题就是4楼说的2、3两点了。

avatar
a*r
13
输出为:
SECONDSTRING
SECONDSTRING
明白了为啥不能用static, 多谢!

【在 S**I 的大作中提到】
: try the following:
: char *s1 = "firststring";
: char *s2 = "secondstring";
: char *t1 = ToUpper(s1);
: char *t2 = ToUpper(s2);
: printf("%s\n", t1);
: printf("%s\n", t2);

avatar
b*e
14
you need to make it clear about the static as well as the thread-safe
concept.
avatar
c*o
15
你去掉static能输出正确答案吗?

【在 a********r 的大作中提到】
: 输出为:
: SECONDSTRING
: SECONDSTRING
: 明白了为啥不能用static, 多谢!

avatar
c*o
16
还是要动态分配空间,恩。
avatar
a*r
17
对!

【在 c******o 的大作中提到】
: 还是要动态分配空间,恩。
avatar
f*t
18
使用静态buffer虽然不安全,但不能说就是错的,主要看运行的结果如何使用。像前面
那个程序如果先printf string1再处理并printf string2,就不会有问题。
如果返回的字符串不是立即使用,有两种办法:动态分配空间,和直接修改原字符串。
动态分配空间最大的坏处在于,使用完之后需要手动释放,一旦忘记就会造成内存泄露
。所以建议在调用ToUpper()前分配好空间,将指针传入函数由它修改。
另外用分配在栈上的空间作为buffer,返回一个指针,很可能等不到使用这段内存就被
释放了,程序出现内存错误。
还有就是楼主的代码没有检查数组越界的问题,如果传入的字符串长度超过了1000就会
出问题。

【在 S**I 的大作中提到】
: 单线程也是错的,buffer是一个全局变量,如果对不止一个字符串调用这个函数,所有
: 返回的字符串都会指向buffer。

avatar
a*r
19
"还有就是楼主的代码没有检查数组越界的问题,如果传入的字符串长度超过了1000就会
出问题。"
我检查了越界的问题, 好像用了static, 长度就没关系了。But don't know why. 你
可以试试。例如,用 static TCHAR buffer[1], 传入一个长度为10的字符串。

【在 f*******t 的大作中提到】
: 使用静态buffer虽然不安全,但不能说就是错的,主要看运行的结果如何使用。像前面
: 那个程序如果先printf string1再处理并printf string2,就不会有问题。
: 如果返回的字符串不是立即使用,有两种办法:动态分配空间,和直接修改原字符串。
: 动态分配空间最大的坏处在于,使用完之后需要手动释放,一旦忘记就会造成内存泄露
: 。所以建议在调用ToUpper()前分配好空间,将指针传入函数由它修改。
: 另外用分配在栈上的空间作为buffer,返回一个指针,很可能等不到使用这段内存就被
: 释放了,程序出现内存错误。
: 还有就是楼主的代码没有检查数组越界的问题,如果传入的字符串长度超过了1000就会
: 出问题。

avatar
e*l
20
…… 这个越界检查是必须的,你现在没问题是因为程序不大…

就会

【在 a********r 的大作中提到】
: "还有就是楼主的代码没有检查数组越界的问题,如果传入的字符串长度超过了1000就会
: 出问题。"
: 我检查了越界的问题, 好像用了static, 长度就没关系了。But don't know why. 你
: 可以试试。例如,用 static TCHAR buffer[1], 传入一个长度为10的字符串。

avatar
S*I
21
没发现问题不等于没问题;undefined behavior包括看起来正确的behavior。

就会

【在 a********r 的大作中提到】
: "还有就是楼主的代码没有检查数组越界的问题,如果传入的字符串长度超过了1000就会
: 出问题。"
: 我检查了越界的问题, 好像用了static, 长度就没关系了。But don't know why. 你
: 可以试试。例如,用 static TCHAR buffer[1], 传入一个长度为10的字符串。

avatar
a*r
22
我完全同意。大侠,是不是能对下面的现象找个理由?
....
static TCHAR buffer[1];
...
when input string is "firststring", calling this function still output the
correct result "FIRSTSTRING"

【在 S**I 的大作中提到】
: 没发现问题不等于没问题;undefined behavior包括看起来正确的behavior。
:
: 就会

avatar
f*t
23
最后提个意见,如果不打算在原字符串上作修改,函数参数前最好加个const,变成:
TCHAR* ToUpper(const TCHAR *input);
这是个编程的好习惯。
avatar
f*5
24
也提个意见
if(!p)

【在 f*******t 的大作中提到】
: 最后提个意见,如果不打算在原字符串上作修改,函数参数前最好加个const,变成:
: TCHAR* ToUpper(const TCHAR *input);
: 这是个编程的好习惯。

avatar
k*n
25
兄弟你还是别去写程序了。。。会害死一个公司的。。。

就会

【在 a********r 的大作中提到】
: "还有就是楼主的代码没有检查数组越界的问题,如果传入的字符串长度超过了1000就会
: 出问题。"
: 我检查了越界的问题, 好像用了static, 长度就没关系了。But don't know why. 你
: 可以试试。例如,用 static TCHAR buffer[1], 传入一个长度为10的字符串。

avatar
y*g
26
ft
那是因为static存放的地方不一样。显然Overwrite了其他的static/global variable.
只是没有立刻去读那些数据,所以看起来情况没有local overwrite那么严重
这种bug更扯,因为要到以后才能发现。而且static的东西是程序共享的,到时候很难
debug
怎么能说这种行为时没关系?
no offense, 但你要真打算转行的话还是系统的学习一下C. 另外标准说undefined,或
者教材说不要做的就最好不要做,哪怕暂时对了一下。

就会

【在 a********r 的大作中提到】
: "还有就是楼主的代码没有检查数组越界的问题,如果传入的字符串长度超过了1000就会
: 出问题。"
: 我检查了越界的问题, 好像用了static, 长度就没关系了。But don't know why. 你
: 可以试试。例如,用 static TCHAR buffer[1], 传入一个长度为10的字符串。

avatar
c*o
27
啊?怎么系统的学习一下啊。
什么书推荐,thx

variable.

【在 y*******g 的大作中提到】
: ft
: 那是因为static存放的地方不一样。显然Overwrite了其他的static/global variable.
: 只是没有立刻去读那些数据,所以看起来情况没有local overwrite那么严重
: 这种bug更扯,因为要到以后才能发现。而且static的东西是程序共享的,到时候很难
: debug
: 怎么能说这种行为时没关系?
: no offense, 但你要真打算转行的话还是系统的学习一下C. 另外标准说undefined,或
: 者教材说不要做的就最好不要做,哪怕暂时对了一下。
:
: 就会

avatar
S*I
28
Read the standard :)

【在 c******o 的大作中提到】
: 啊?怎么系统的学习一下啊。
: 什么书推荐,thx
:
: variable.

avatar
y*g
29
找本英文教材从头看到尾,把习题都做一遍

【在 c******o 的大作中提到】
: 啊?怎么系统的学习一下啊。
: 什么书推荐,thx
:
: variable.

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。