我想撰寫一個程式,當我在終端上并寫入時,prog.exe -u word它將轉換word為大寫,否則跳過該程序。但是當我編譯下面的代碼時,螢屏上什么也沒有,我無法弄清楚為什么會發生錯誤。
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
char u[] = "-u";
void upper(const char *src, char *dest);
int main(int argc, char const *argv[]) {
if (argc < 3) {
printf("Input at least 3 argument!\n");
} else
if (!(strcmp(argv[1], u))) {
char *output;
upper(argv[2], output);
printf("%s\n", output);
} else {
printf("No option\n");
}
return 0;
}
void upper(const char *src, char *dest) {
while (*src) {
if (*src >= 97 && *src <= 122) {
*dest = *src - 32;
} else {
*dest = *src;
}
src ;
dest ;
}
*dest = *src;
}
uj5u.com熱心網友回復:
指標output宣告為
char * output;
未初始化并且具有不確定的值。
所以在函式中使用它會upper呼叫未定義的行為。
您應該使用足夠大的字符陣列來存盤傳遞給函式的字串,而不是指標。
如果編譯器支持變長陣列,那么你可以寫
char output[ strlen( argv[2] ) 1 ];
而這個 if 陳述句
else if( strcmp(argv[1],u) == 0 ){
將比這個 if 陳述句更具可讀性
else if(!(strcmp(argv[1],u))){
在函式內使用字符符號'a'而'z'不是幻數97和122在 if 陳述句中至少會更好
if(*src >= 97 && *src <= 122){
*dest = *src - 32;
}
盡管使用標準函式islower并toupper在 header 中宣告更好<ctype.h>。
可以通過以下方式宣告和定義該函式
#include <ctype.h>
//...
char * upper( char *dest, const char *src )
{
char *result = dest;
do
{
if ( islower( ( unsigned char )*src ) )
{
*dest = toupper( ( unsigned char )*src );
}
else
{
*dest = *src;
}
} while ( *src );
return result;
}
uj5u.com熱心網友回復:
void upper(const char *src, char *dest) {
char *tmp = dest; // hold pointer
while(*src) {
*dest = (*src >= 97 && *src <= 122) ? *src - 32 : src;
src; dest;
}
*dest = '\0'; // end of string
dest = tmp;
}
uj5u.com熱心網友回復:
該程式具有未定義的行為,因為您試圖將轉換后的字串存盤到未初始化的指標中output。
請注意,使用諸如97,122和 之類的硬編碼常量32對于非 ASCII 環境既令人困惑又不可移植。您應該使用 的宏和函式<ctype.h>來提高可讀性和可移植性。
您可以通過這種方式簡單地修改引數字串:
#include <ctype.h>
#include <stdio.h>
void upper(char *str);
int main(int argc, char *argv[]) {
if (argc < 3) {
printf("Input at least 3 arguments!\n");
} else
if (!(strcmp(argv[1], "-u"))) {
printf("%s\n", upper(argv[2]));
} else {
printf("No option\n");
}
return 0;
}
char *upper(char *str) {
for (char *p = str; *p; p ) {
*p = toupper((unsigned char)*p);
}
return str;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/386843.html
